From: newsham AT aloha DOT net (Tim Newsham) Subject: fatal race condition 21 Jul 1997 16:43:39 -0700 Approved: cygnus DOT gnu-win32 AT cygnus DOT com Distribution: cygnus Message-ID: <199707212247.MAA21599.cygnus.gnu-win32@haleakala.aloha.net> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Original-To: gnu-win32 AT cygnus DOT com X-Mailer: ELM [version 2.4 PL24 PGP3 *ALPHA*] Original-Sender: owner-gnu-win32 AT cygnus DOT com Hi,, There's a race condition between fork and signals. This program demonstrates the problem. Tim N. --- forkbug.c --- /* * forkbug.c * Demonstrate bug in cygwin fork and signal code * * This code demonstrates a race condition between the signal code * and the fork code in cygwin. When run this program will lock * up all cygwin processes. The problem occurs when a signal * is delivered to a process when it is forking. This seems * to corrupt the process' state which later causes the system * to hang when the process exits. */ #include #include int child; void handler(int sig) { /* send signal to child, child should be in fork() */ kill(child, SIGINT); } main() { int res; child = fork(); if(child == 0) { /* child - * sleep, then signal parent, then fork * parent will signal us while we're forking */ sleep(1); kill(getppid(), SIGINT); res = fork(); printf("done fork, child %d, pid %d, parent %d\n", res, getpid(), getppid()); exit(0); } else { /* parent - * sleep waiting for signal */ signal(SIGINT, handler); sleep(20); exit(0); } } - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request AT cygnus DOT com" with one line of text: "help".