fatal race condition

Tim Newsham newsham@aloha.net
Mon Jul 21 15:47:00 GMT 1997


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 <sys/types.h>
#include <signal.h>
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@cygnus.com" with one line of text: "help".


More information about the Cygwin mailing list

AltStyle によって変換されたページ (->オリジナル) /