Mail Archives: cygwin/2003/04/02/22:05:56
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 aaaspam AT sourceware DOT org
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/
- Raw text -