1 /* $OpenBSD: earlysig.c,v 1.2 2007/08/01 21:32:53 miod Exp $ */ 2 3 /* 4 * Public domain. 2005, Otto Moerbeek 5 * 6 * Try to create the case where a signal is delivered to a process before 7 * fork() returns. 8 */ 9 10 #include <sys/types.h> 11 #include <sys/wait.h> 12 13 #include <err.h> 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <signal.h> 17 #include <unistd.h> 18 19 void dohup(int signo) 20 { 21 } 22 23 int 24 main() 25 { 26 pid_t pid; 27 int status; 28 29 signal(SIGHUP, dohup); 30 31 switch(pid = fork()) { 32 case -1: 33 err(1, "fork"); 34 break; 35 case 0: 36 sleep(2); 37 exit(0); 38 default: 39 kill(pid, SIGHUP); 40 sleep(1); 41 if (waitpid(pid, &status, 0) == -1) 42 err(1, "waitpid"); 43 if (WIFEXITED(status) && WEXITSTATUS(status) == 0) 44 exit(0); 45 else 46 errx(1, "child exited with status %d", 47 WEXITSTATUS(status)); 48 } 49 } 50