1 2 $ uname -ra Linux Rapture 4.15.0-72-generic #81~16.04.1-Ubuntu SMP Tue Nov 26 16:34:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
signal.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include <cstdio> #include <cstring> #include <cstdlib> #include <time.h> #include <unistd.h> #include <signal.h> using namespace std;void handle (int num) { printf ("signal num: %d\n" , num); sleep (5 ); printf ("sleep over\n" ); } int main (int argc, char *argv[]) { for (int i = 1 ; i < argc;) { if (strcmp (argv[i], "--handle" ) == 0 ) { signal (atoi (argv[i + 1 ]), handle); i += 2 ; continue ; } i++; } printf ("pid: %d\n" , getpid ()); while (true ) { printf ("%d\n" , time (NULL )); sleep (1 ); } return 0 ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ ./signal & [1] 6223 pid: 6223 1577155844 1577155845 $ kill -KILL 6223 [1] + 6223 killed ./signal $ ./signal --handle 9 & [1] 6261 pid: 6261 1577155864 1577155865 $ kill -KILL 6261 [1] + 6261 killed ./signal --handle 9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 $ ./signal & [1] 6471 pid: 6471 1577156088 1577156089 $ kill -SIGSTOP 6471 [1] + 6471 suspended (signal) ./signal ...... $ kill -SIGCONT 6471 1577156113 1577156114 1577156115 1577156116 1577156117 $ ./signal --handle 18 19 & [1] 6566 pid: 6566 1577156249 1577156250 $ kill -SIGSTOP 6566 [1] + 6566 suspended (signal) ./signal --handle 18 19 ...... $ kill -SIGCONT 6566 signal num: 18 sleep over 1577156270 1577156271
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 $ ./signal --handle 15 & [1] 7148 pid: 7148 1577156583 1577156584 1577156585 $ kill -SIGTERM 7148 $ kill -SIGTERM 7148 $ kill -SIGTERM 7148 $ kill -SIGTERM 7148 $ kill -SIGTERM 7148 signal num: 15 sleep over signal num: 15 sleep over 1577156597 1577156598 1577156599 1577156600 1577156601 ...... $ kill -KILL 7148 [1] + 7148 killed ./signal --handle 15
wait.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 #include <cstdio> #include <cstring> #include <cstdlib> #include <signal.h> #include <time.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> using namespace std;void handle (int num) { printf ("signal num: %d\n" , num); } int main (int argc, char *argv[]) { int options = 0 ; bool divide_zero = false ; bool invalid_memory = false ; for (int i = 1 ; i < argc;) { if (strcmp (argv[i], "--WUNTRACED" ) == 0 ) { options |= WUNTRACED; i++; continue ; } else if (strcmp (argv[i], "--WNOHANG" ) == 0 ) { options |= WNOHANG; i++; continue ; } else if (strcmp (argv[i], "--WCONTINUED" ) == 0 ) { options |= WCONTINUED; i++; continue ; } else if (strcmp (argv[i], "--handle" ) == 0 ) { signal (atoi (argv[i + 1 ]), handle); i += 2 ; continue ; } else if (strcmp (argv[i], "--divide-zero" ) == 0 ) { divide_zero = true ; i++; continue ; } else if (strcmp (argv[i], "--invalid-memory" ) == 0 ) { invalid_memory = true ; i++; continue ; } i++; } pid_t cpid, w; int status; cpid = fork(); if (cpid == -1 ) { fprintf (stderr, "fork failed\n" ); exit (EXIT_FAILURE); } if (cpid == 0 ) { printf ("Child PID is %ld\n" , (long ) getpid ()); if (divide_zero) { int x = 1337 ; int y = x / 0 ; printf ("%d\n" , y); } if (invalid_memory) { *(int *) 0 = 1337 ; } while (true ) { printf ("time: %d\n" , time (NULL )); sleep (1 ); } } else { printf ("Father PID is %ld\n" , (long ) getpid ()); do { w = waitpid (cpid, &status, options); printf ("w: %d, WIFEXITED: %d, WIFSIGNALED: %d, WIFSTOPPED: %d, WIFCONTINUED: %d\n" , w, WIFEXITED (status), WIFSIGNALED (status), WIFSTOPPED (status), WIFCONTINUED (status)); if (w == 0 ) { continue ; } if (w == -1 ) { fprintf (stderr, "waitpid error\n" ); exit (EXIT_FAILURE); } if (WIFEXITED (status)) { printf ("exited, status=%d\n" , WEXITSTATUS (status)); } else if (WIFSIGNALED (status)) { printf ("killed by signal %d\n" , WTERMSIG (status)); } else if (WIFSTOPPED (status)) { printf ("stopped by signal %d\n" , WSTOPSIG (status)); } else if (WIFCONTINUED (status)) { printf ("continued\n" ); } } while ((!WIFEXITED (status) && !WIFSIGNALED (status)) || w == 0 ); exit (EXIT_SUCCESS); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $ ./wait & [1] 7523 Father PID is 7523 Child PID is 7525 time: 1577156913 time: 1577156914 time: 1577156915 time: 1577156916 $ kill 7525 w: 7525, WIFEXITED: 0, WIFSIGNALED: 1, WIFSTOPPED: 0, WIFCONTINUED: 0 killed by signal 15 $ ./wait --handle 15 Father PID is 7566 Child PID is 7567 time: 1577156938 time: 1577156939 time: 1577156940 time: 1577156941 $ kill 7567 signal num: 15 time: 1577156941 time: 1577156942 $ kill -KILL 7567 w: 7567, WIFEXITED: 0, WIFSIGNALED: 1, WIFSTOPPED: 0, WIFCONTINUED: 0 killed by signal 9
1 2 3 4 5 6 7 8 9 10 11 12 13 $ ./wait --divide-zero Child PID is 7744 Father PID is 7743 w: 7744, WIFEXITED: 0, WIFSIGNALED: 1, WIFSTOPPED: 0, WIFCONTINUED: 0 killed by signal 8 $ ./wait --divide-zero --handle 8 Father PID is 7716 Child PID is 7717 signal num: 8 signal num: 8 signal num: 8 ......
1 2 3 4 5 6 7 8 9 10 11 12 $ ./wait --invalid-memory Father PID is 8085 Child PID is 8086 w: 8086, WIFEXITED: 0, WIFSIGNALED: 1, WIFSTOPPED: 0, WIFCONTINUED: 0 killed by signal 11 $ ./wait --invalid-memory --handle 11 Father PID is 8432 Child PID is 8433 signal num: 11 signal num: 11 ......
1 2 3 4 5 6 7 8 9 10 11 $ ./wait --WNOHANG & Father PID is 9033 Child PID is 9034 w: 0, WIFEXITED: 1, WIFSIGNALED: 0, WIFSTOPPED: 0, WIFCONTINUED: 0 w: 0, WIFEXITED: 1, WIFSIGNALED: 0, WIFSTOPPED: 0, WIFCONTINUED: 0 time: 1577157886 time: 1577157887 ...... $ kill 9034 w: 9034, WIFEXITED: 0, WIFSIGNALED: 1, WIFSTOPPED: 0, WIFCONTINUED: 0 killed by signal 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 $ ./wait --WUNTRACED --WCONTINUED --handle 15 & [1] 9312 Child PID is 9314 time: 1577158011 Father PID is 9312 time: 1577158013 time: 1577158014 $ kill 9314 signal num: 15 time: 1577158015 time: 1577158016 ...... time: 1577158025 time: 1577158026 time: 1577158027 time: 1577158028 $ kill -SIGSTOP 9314 w: 9314, WIFEXITED: 0, WIFSIGNALED: 0, WIFSTOPPED: 1, WIFCONTINUED: 0 stopped by signal 19 $ kill -SIGCONT 9314 w: 9314, WIFEXITED: 0, WIFSIGNALED: 0, WIFSTOPPED: 0, WIFCONTINUED: 1 continued time: 1577158038 ... time: 1577158041 $ kill -SIGKILL 9314 w: 9314, WIFEXITED: 0, WIFSIGNALED: 1, WIFSTOPPED: 0, WIFCONTINUED: 0 killed by signal 9