Skip to content

Instantly share code, notes, and snippets.

@scottt
Last active July 10, 2022 08:33
Show Gist options
  • Select an option

  • Save scottt/4be611b3bda78ef41988e1fe2c83924e to your computer and use it in GitHub Desktop.

Select an option

Save scottt/4be611b3bda78ef41988e1fe2c83924e to your computer and use it in GitHub Desktop.
signalfd SIGCHLD handling
/* Burn some CPU time then segfault */
int main()
{
volatile int i;
for (i=0; i>=0; i++)
;
*(volatile char*)0;
return 0;
}
#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");
}
}
}
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 +++
@scottt
Copy link
Author

scottt commented May 25, 2018

$ ./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.

@sfzhi
Copy link

sfzhi commented Jul 10, 2022

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