4 sigchild_handler(int signum)
6 printf("SIGCHLD received\n");
10 sigsegv_handler(int signum)
13 printf("SIGSEGV received on process %d\n", pid);
18 sigalrm_handler(int signum)
21 printf("I, pid %d, have received an alarm!\n", pid);
27 signal(SIGCHLD, sigchild_handler);
28 signal(SIGSEGV, sigsegv_handler);
29 signal(SIGALRM, sigalrm_handler);
36 printf("Child sleep 3s, parent pause.\n");
44 printf("Parent resumed on SIGCHILD\n");
46 for (int i = 0; i < 5; i++) {
48 if (!(pid = fork())) {
49 signal(SIGSEGV, sigsegv_handler);
52 i = *(int*)0xdeadc0de; // seg fault!
57 printf("Forked %d\n", pid);
60 while ((p = wait(&status)) >= 0) {
61 short code = WEXITSTATUS(status);
62 if (WIFSIGNALED(status)) {
63 printf("Process %d terminated by signal, exit_code: %d\n", p, code);
64 } else if (WIFEXITED(status)) {
65 printf("Process %d exited with code %d\n", p, code);
67 printf("Process %d aborted with code %d\n", p, code);