#include #include #include #include #include int doit = 0; void ouch (int sig) { fprintf (stderr, "ouch %d\n", sig); if (doit++ > 0) kill (getpid (), SIGTERM); } int main (int argc, char **argv) { static struct sigaction act; if (argc == 1) act.sa_flags = SA_RESETHAND; act.sa_handler = ouch; sigaction (SIGSEGV, &act, NULL); int pid = fork (); int status; if (pid > 0) waitpid (pid, &status, 0); else { int *i = 0; *i = 9; exit (0x42); } status &= ~0x80; // remove core dump flag fprintf (stderr, "pid %d exited with status %p\n", pid, (void *) status); exit (argc == 1 ? !(status == SIGSEGV) : !(status == SIGTERM)); }