2006-01-02 01:26:52 +08:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <sys/wait.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
int doit = 0;
|
|
|
|
void
|
|
|
|
ouch (int sig)
|
|
|
|
{
|
2006-01-02 02:02:54 +08:00
|
|
|
if (doit++ > 0)
|
2006-01-02 01:26:52 +08:00
|
|
|
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;
|
2006-01-02 02:02:54 +08:00
|
|
|
sigaction (SIGSEGV, &act, NULL);
|
2006-01-02 01:26:52 +08:00
|
|
|
int pid = fork ();
|
|
|
|
int status;
|
|
|
|
if (pid > 0)
|
|
|
|
waitpid (pid, &status, 0);
|
|
|
|
else
|
|
|
|
{
|
2006-01-02 02:02:54 +08:00
|
|
|
int *i = 0;
|
|
|
|
*i = 9;
|
|
|
|
exit (0x42);
|
2006-01-02 01:26:52 +08:00
|
|
|
}
|
2006-01-02 12:01:22 +08:00
|
|
|
status &= ~0x80; // remove core dump flag
|
2006-01-02 14:15:58 +08:00
|
|
|
printf ("pid %d exited with status %p\n", pid, (void *) status);
|
2006-01-02 02:02:54 +08:00
|
|
|
exit (argc == 1 ? !(status == SIGSEGV) : !(status == SIGTERM));
|
2006-01-02 01:26:52 +08:00
|
|
|
}
|