This is the mail archive of the
cygwin-developers@cygwin.com
mailing list for the Cygwin project.
Re: exec()'s behavior when ppid == 1
- From: Christopher Faylor <cgf at redhat dot com>
- To: cygwin-developers at cygwin dot com
- Date: Mon, 2 Jun 2003 21:10:17 -0400
- Subject: Re: exec()'s behavior when ppid == 1
- References: <3.0.5.32.20030602202133.007fb900@mail.attbi.com>
- Reply-to: cygwin-developers at cygwin dot com
On Mon, Jun 02, 2003 at 08:21:33PM -0400, Pierre A. Humblet wrote:
>Chris,
>
>When Windows spawns a Cygwin process A, A has ppid 1 and ppid_handle 0.
>If process A execs B, Cygwin keeps A alive. If B then execs C, B stays
>alive too. When C terminates, B and A follow suit and Windows goes on its way.
>So far so good.
>
>Now suppose that A forks X and A terminates. Windows goes on its way
>right away.
>Meanwhile X (which now has ppid 1 but a non zero ppid_handle) execs B
>and X is kept alive. If B execs C, B is also kept alive. When C
>terminates, B and X follow suit.
>
>Q: Why does it help to keep X and B alive until C terminates?
I'd prefer this patch, if it still works as desired.
It seems to in my limited testing.
cgf
Index: spawn.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/spawn.cc,v
retrieving revision 1.121
diff -u -p -r1.121 spawn.cc
--- spawn.cc 19 May 2003 01:43:31 -0000 1.121
+++ spawn.cc 3 Jun 2003 01:06:31 -0000
@@ -800,9 +800,9 @@ spawn_guts (const char * prog_arg, const
reset_signal_arrived ();
continue;
case WAIT_OBJECT_0 + 2:
- if (myself->ppid_handle)
+ if (my_parent_is_alive ())
res |= EXIT_REPARENTING;
- if (!my_parent_is_alive ())
+ else if (!myself->ppid_handle)
{
nwait = 2;
sigproc_terminate ();