sigaction provides a more portable way of installing signals --- surf.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/surf.c b/surf.c index 2b54e3c..65a5e66 100644 --- a/surf.c +++ b/surf.c @@ -316,9 +316,20 @@ setup(void) GdkDisplay *gdpy; int i, j; + struct sigaction sachld; + struct sigaction sahup; + + memset(&sachld, 0, sizeof(struct sigaction)); + memset(&sahup, 0, sizeof(struct sigaction)); + + sachld.sa_handler = sigchld; + sahup.sa_handler = sighup; + /* clean up any zombies immediately */ - sigchld(0); - if (signal(SIGHUP, sighup) == SIG_ERR) + if (sigaction(SIGCHLD, &sachld, NULL) == -1) + die("Can't install SIGCHLD handler"); + + if (sigaction(SIGHUP, &sahup, NULL) == -1) die("Can't install SIGHUP handler"); if (!(dpy = XOpenDisplay(NULL))) @@ -402,8 +413,6 @@ setup(void) void sigchld(int unused) { - if (signal(SIGCHLD, sigchld) == SIG_ERR) - die("Can't install SIGCHLD handler"); while (waitpid(-1, NULL, WNOHANG) > 0) ; } -- 2.29.0