summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sandman.m13
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");