Last active
July 10, 2022 08:33
-
-
Save scottt/4be611b3bda78ef41988e1fe2c83924e to your computer and use it in GitHub Desktop.
signalfd SIGCHLD handling
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* Burn some CPU time then segfault */ | |
| int main() | |
| { | |
| volatile int i; | |
| for (i=0; i>=0; i++) | |
| ; | |
| *(volatile char*)0; | |
| return 0; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <sys/signalfd.h> | |
| #include <sys/types.h> | |
| #include <sys/select.h> | |
| #include <assert.h> | |
| #include <signal.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| #include <spawn.h> | |
| #define handle_error(msg) \ | |
| do { perror(msg); exit(EXIT_FAILURE); } while (0) | |
| void decode_exit_status(int status) | |
| { | |
| if (WIFEXITED(status)) { | |
| fprintf(stderr, "child process exited with status: %d\n", WEXITSTATUS(status)); | |
| } else if (WIFSIGNALED(status)) { | |
| fprintf(stderr, "child process terminated by signal %d (%s)\n", WTERMSIG(status), strsignal(WTERMSIG(status))); | |
| } else if (WIFSTOPPED(status)) { | |
| fprintf(stderr, "child process stopped\n"); | |
| } else if (WIFCONTINUED(status)) { | |
| fprintf(stderr, "child process continued\n"); | |
| } else { | |
| assert(0); | |
| } | |
| } | |
| int main(int argc, char *argv[]) | |
| { | |
| pid_t child_pid; | |
| sigset_t mask; | |
| int sfd0, r; | |
| struct signalfd_siginfo fdsi; | |
| ssize_t s; | |
| fd_set rfds; | |
| posix_spawnattr_t sattr; | |
| sigemptyset(&mask); | |
| sigaddset(&mask, SIGINT); | |
| sigaddset(&mask, SIGQUIT); | |
| sigaddset(&mask, SIGCHLD); | |
| /* Block signals so that they aren't handled | |
| * according to their default dispositions */ | |
| if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) | |
| handle_error("sigprocmask"); | |
| sfd0 = signalfd(-1, &mask, 0); | |
| if (sfd0 == -1) | |
| handle_error("signalfd"); | |
| r = posix_spawnattr_init(&sattr); | |
| if (r != 0) | |
| handle_error("posix_spawnattr_init"); | |
| char *child_args[] = { "./burn-cpu-and-segfault", NULL }; | |
| r = posix_spawn(&child_pid, | |
| child_args[0], | |
| NULL, /* file_actions */ | |
| &sattr, | |
| child_args, | |
| NULL); /* envp */ | |
| if (r != 0) | |
| handle_error("posix_spawn"); | |
| fprintf(stderr, "child_pid: %d\n", child_pid); | |
| for (;;) { | |
| FD_ZERO(&rfds); | |
| FD_SET(sfd0, &rfds); | |
| r = select(sfd0 + 1, &rfds, NULL, NULL, NULL); | |
| if (r == -1) | |
| handle_error("select"); | |
| if (FD_ISSET(sfd0, &rfds)) { | |
| fprintf(stderr, "sfd0: set, pre read\n"); | |
| s = read(sfd0, &fdsi, sizeof(struct signalfd_siginfo)); | |
| if (s != sizeof(struct signalfd_siginfo)) | |
| handle_error("read"); | |
| fprintf(stderr, "sfd0: post read\n"); | |
| if (fdsi.ssi_signo == SIGINT) { | |
| fprintf(stderr, "sfd0: got SIGINT\n"); | |
| } else if (fdsi.ssi_signo == SIGQUIT) { | |
| fprintf(stderr, "sfd0: got SIGQUIT\n"); | |
| } else if (fdsi.ssi_signo == SIGCHLD) { | |
| fprintf(stderr, "sfd0: got SIGCHLD\n"); | |
| decode_exit_status(fdsi.ssi_status); | |
| fprintf(stderr, "pid: %d\n", fdsi.ssi_pid); | |
| fprintf(stderr, "utime (User CPU Time): %lu\n", fdsi.ssi_utime); | |
| fprintf(stderr, "stime (System CPU Time): %lu\n", fdsi.ssi_stime); | |
| } else { | |
| fprintf(stderr, "sfd0: got signal %d (%s)\n", fdsi.ssi_signo, strsignal(fdsi.ssi_signo)); | |
| } | |
| exit(EXIT_SUCCESS); | |
| } else { | |
| fprintf(stderr, "sfd0, not set\n"); | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 252809 execve("./signalfd-child-status", ["./signalfd-child-status"], 0x7fff27ccfef0 /* 95 vars */) = 0 | |
| 252809 brk(NULL) = 0x25b6000 | |
| 252809 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) | |
| 252809 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 | |
| 252809 fstat(3, {st_mode=S_IFREG|0644, st_size=377201, ...}) = 0 | |
| 252809 mmap(NULL, 377201, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f27f3f6c000 | |
| 252809 close(3) = 0 | |
| 252809 openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 | |
| 252809 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2402\2\0\0\0\0\0"..., 832) = 832 | |
| 252809 fstat(3, {st_mode=S_IFREG|0755, st_size=1824656, ...}) = 0 | |
| 252809 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f27f3f6a000 | |
| 252809 mmap(NULL, 3926752, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f27f39e5000 | |
| 252809 mprotect(0x7f27f3b9a000, 2097152, PROT_NONE) = 0 | |
| 252809 mmap(0x7f27f3d9a000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b5000) = 0x7f27f3d9a000 | |
| 252809 mmap(0x7f27f3da0000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f27f3da0000 | |
| 252809 close(3) = 0 | |
| 252809 arch_prctl(ARCH_SET_FS, 0x7f27f3f6b500) = 0 | |
| 252809 mprotect(0x7f27f3d9a000, 16384, PROT_READ) = 0 | |
| 252809 mprotect(0x601000, 4096, PROT_READ) = 0 | |
| 252809 mprotect(0x7f27f3fc9000, 4096, PROT_READ) = 0 | |
| 252809 munmap(0x7f27f3f6c000, 377201) = 0 | |
| 252809 rt_sigprocmask(SIG_BLOCK, [INT QUIT CHLD], NULL, 8) = 0 | |
| 252809 signalfd4(-1, [INT QUIT CHLD], 8, 0) = 3 | |
| 252809 mmap(NULL, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7f27f3fc0000 | |
| 252809 rt_sigprocmask(SIG_BLOCK, ~[], [INT QUIT CHLD], 8) = 0 | |
| 252809 clone( <unfinished ...> | |
| 252810 rt_sigprocmask(SIG_BLOCK, NULL, ~[KILL STOP], 8) = 0 | |
| 252810 rt_sigaction(SIGHUP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGHUP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGINT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGQUIT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGILL, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGILL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGTRAP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGTRAP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGABRT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGABRT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGBUS, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGBUS, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGFPE, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGFPE, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGUSR1, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGUSR1, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGSEGV, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGSEGV, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGUSR2, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGUSR2, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGPIPE, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGPIPE, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGALRM, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGALRM, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGTERM, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGTERM, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGSTKFLT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGSTKFLT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGCONT, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGCONT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGTSTP, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGTSTP, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGTTIN, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGTTIN, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGTTOU, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGTTOU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGURG, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGURG, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGXCPU, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGXCPU, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGXFSZ, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGXFSZ, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGVTALRM, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGVTALRM, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGPROF, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGPROF, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGWINCH, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGWINCH, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGIO, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGIO, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGPWR, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGPWR, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGSYS, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGSYS, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRTMIN, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_1, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_2, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_2, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_3, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_3, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_4, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_4, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_5, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_5, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_6, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_6, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_7, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_7, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_8, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_8, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_9, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_9, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_10, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_10, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_11, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_11, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_12, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_12, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_13, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_13, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_14, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_14, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_15, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_15, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_16, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_16, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_17, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_17, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_18, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_18, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_19, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_19, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_20, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_20, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_21, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_21, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_22, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_22, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_23, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_23, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_24, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_24, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_25, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_25, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_26, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_26, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_27, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_27, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_28, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_28, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_29, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_29, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_30, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_30, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_31, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_31, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_32, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0 | |
| 252810 rt_sigaction(SIGRT_32, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f27f3a1bfb0}, NULL, 8) = 0 | |
| 252810 rt_sigprocmask(SIG_SETMASK, [INT QUIT CHLD], NULL, 8) = 0 | |
| 252810 execve("./burn-cpu-and-segfault", ["./burn-cpu-and-segfault"], NULL <unfinished ...> | |
| 252809 <... clone resumed> child_stack=0x7f27f3fc8ff0, flags=CLONE_VM|CLONE_VFORK|SIGCHLD) = 252810 | |
| 252809 munmap(0x7f27f3fc0000, 36864) = 0 | |
| 252809 rt_sigprocmask(SIG_SETMASK, [INT QUIT CHLD], <unfinished ...> | |
| 252810 <... execve resumed> ) = 0 | |
| 252809 <... rt_sigprocmask resumed> NULL, 8) = 0 | |
| 252810 brk(NULL <unfinished ...> | |
| 252809 write(2, "child_pid: 252810\n", 18 <unfinished ...> | |
| 252810 <... brk resumed> ) = 0x1430000 | |
| 252809 <... write resumed> ) = 18 | |
| 252810 access("/etc/ld.so.preload", R_OK <unfinished ...> | |
| 252809 select(4, [3], NULL, NULL, NULL <unfinished ...> | |
| 252810 <... access resumed> ) = -1 ENOENT (No such file or directory) | |
| 252810 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 4 | |
| 252810 fstat(4, {st_mode=S_IFREG|0644, st_size=377201, ...}) = 0 | |
| 252810 mmap(NULL, 377201, PROT_READ, MAP_PRIVATE, 4, 0) = 0x7ffac7123000 | |
| 252810 close(4) = 0 | |
| 252810 openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 4 | |
| 252810 read(4, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2402\2\0\0\0\0\0"..., 832) = 832 | |
| 252810 fstat(4, {st_mode=S_IFREG|0755, st_size=1824656, ...}) = 0 | |
| 252810 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffac7121000 | |
| 252810 mmap(NULL, 3926752, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7ffac6b9c000 | |
| 252810 mprotect(0x7ffac6d51000, 2097152, PROT_NONE) = 0 | |
| 252810 mmap(0x7ffac6f51000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x1b5000) = 0x7ffac6f51000 | |
| 252810 mmap(0x7ffac6f57000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffac6f57000 | |
| 252810 close(4) = 0 | |
| 252810 arch_prctl(ARCH_SET_FS, 0x7ffac71224c0) = 0 | |
| 252810 mprotect(0x7ffac6f51000, 16384, PROT_READ) = 0 | |
| 252810 mprotect(0x600000, 4096, PROT_READ) = 0 | |
| 252810 mprotect(0x7ffac7180000, 4096, PROT_READ) = 0 | |
| 252810 munmap(0x7ffac7123000, 377201) = 0 | |
| 252810 --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} --- | |
| 252810 +++ killed by SIGSEGV (core dumped) +++ | |
| 252809 <... select resumed> ) = 1 (in [3]) | |
| 252809 write(2, "sfd0: set, pre read\n", 20) = 20 | |
| 252809 read(3, "\21\0\0\0\0\0\0\0\3\0\0\0\212\333\3\0\364\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 128) = 128 | |
| 252809 write(2, "sfd0: post read\n", 16) = 16 | |
| 252809 write(2, "sfd0: got SIGCHLD\n", 18) = 18 | |
| 252809 write(2, "child process terminated by sign"..., 59) = 59 | |
| 252809 write(2, "pid: 252810\n", 12) = 12 | |
| 252809 write(2, "utime (User CPU Time): 338\n", 27) = 27 | |
| 252809 write(2, "stime (System CPU Time): 0\n", 27) = 27 | |
| 252809 exit_group(0) = ? | |
| 252809 +++ exited with 0 +++ |
Author
The decode_exit_status(fdsi.ssi_status) part is completely wrong. The example appears to work purely by coincidence. The ssi_status field does not contain the same kind of status as returned by wait() and friends. It makes no sense to apply macros like WIFEXITED() to it. As the signalfd(2) man page says, ssi_status contains "exit status or signal" - just that. To know which one it is, you have to examine ssi_code, which contains once of the CLD_* values described in sigaction(2).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
$ ./signalfd-child-status
child_pid: 254214
sfd0: set, pre read
sfd0: post read
sfd0: got SIGCHLD
child process terminated by signal 11 (Segmentation fault)
pid: 254214
utime (User CPU Time): 357
stime (System CPU Time): 0
#Use strace -f -ot.strace ./signalfd-child-status#to generate a syscall trace like 'signalfd-child-status.strace' above.