Subject: Re: 1.3.20 : getpgid returns pid != -1 when specified pid no longer exists
From: Christopher Faylor <[email-masked]>
To: gavin bowlby <[email-masked]>
Cc: [email-masked]
Date: Wed, 2 Apr 2003 22:05:51 -0500

On Wed, Apr 02, 2003 at 06:43:16PM -0800, gavin bowlby wrote:
>>Ok.  In that event, please provide a simple test case.
>
>Here's a short program to recreate this problem:
>
>("main.c")
>=====================================================
>int main(int argc, char *argv[]) {
>
>   int pid, sid, rc;
>
>   if ((pid = fork()) == 0) {
>      // child thread
>      pid = getppid();
>      while(1) {
>         rc = sleep(10);
>         printf("child is alive...\n");
>         if ((sid = getpgid(pid)) == -1) {
>            printf("exiting child process...rc=2\n");
>            exit(2);
>         }
>      }
>   }
>   else {
>      // parent thread
>      while(1) {
>         rc = sleep(10);
>         printf("parent is alive...\n");
>         // check if our child process has been killed
>         if ((sid = getpgid(pid)) == -1)
>            exit(3);
>
>         printf("getpgid of child pid:%d returned
>pid:%d\n", pid, sid);
>      }
>   }
>}
>==========================================
>and here are the steps I used to find the problem:
>
>1) bring up Cygwin shell 1
>2) gcc main.c <create executable>
>3) a.exe <run executable>
>4) let program run 10-15 seconds to see output from
>    parent and child
>5) bring up Cygwin shell 2
>6) ps <to see PIDs of parent and child>
>7) kill -9 <child PID>
>8) observe that parent continues to run, and sees
>   the parent's PID reported as the result of the
>   getpgid
>
>BTW, the same problem occurs if the parent PID is killed - the child
>continues to see that the parent PID is alive.

Try it on UNIX/Linux.  Same behavior.  The pid exists until you wait()
for it.  Add a 'waitpid (pid, &stat, WNOHANG);' before the parent's
getpgid and the loop will terminate on Cygwin or UNIX.

cgf
--
Please use the resources at cygwin.com rather than sending personal email.
Special for spam email harvesters: send email to [email-masked]
and be permanently blocked from mailing lists at sources.redhat.com

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/