exec()'s behavior when ppid == 1

Christopher Faylor cgf@redhat.com
Tue Jun 3 01:10:00 GMT 2003


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 ();



More information about the Cygwin-developers mailing list