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:
>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.


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 ();
 	    case WAIT_OBJECT_0 + 2:
-	      if (myself->ppid_handle)
+	      if (my_parent_is_alive ())
-	      if (!my_parent_is_alive ())
+	      else if (!myself->ppid_handle)
 		  nwait = 2;
 		  sigproc_terminate ();

More information about the Cygwin-developers mailing list