diff options
author | June McEnroe <june@causal.agency> | 2018-12-01 10:28:00 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2018-12-01 10:28:00 -0500 |
commit | e708b795b5f77969f2d3001c9382be01c8205006 (patch) | |
tree | 1229392d351ddd4e064a6864f591f7ccde883b70 | |
parent | Handle signals consistently in the event loop (diff) | |
download | test-e708b795b5f77969f2d3001c9382be01c8205006.tar.gz test-e708b795b5f77969f2d3001c9382be01c8205006.zip |
Use sigaction in sandman
-rw-r--r-- | sandman.m | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sandman.m b/sandman.m index 7d2f56a..44ab267 100644 --- a/sandman.m +++ b/sandman.m @@ -21,11 +21,11 @@ #import <sysexits.h> #import <unistd.h> -void sigchld(int sig) { +void handler(int sig) { (void)sig; int status; pid_t pid = wait(&status); - if (pid < 0) err(EX_OSERR, "wait"); + if (pid < 0) _exit(EX_OSERR); if (WIFSIGNALED(status)) { _exit(128 + WTERMSIG(status)); } else { @@ -36,7 +36,14 @@ void sigchld(int sig) { int main(int argc, char *argv[]) { if (argc < 2) return EX_USAGE; - signal(SIGCHLD, sigchld); + sigset_t mask; + sigemptyset(&mask); + struct sigaction sa = { + .sa_handler = handler, + .sa_mask = mask, + .sa_flags = SA_RESTART, + }; + sigaction(SIGCHLD, &sa, NULL); pid_t pid = fork(); if (pid < 0) err(EX_OSERR, "fork"); |