diff options
Diffstat (limited to 'dwm.c')
-rw-r--r-- | dwm.c | 20 |
1 files changed, 11 insertions, 9 deletions
@@ -259,6 +259,7 @@ static void setmfact(const Arg *arg); static void setup(void); static void seturgent(Client *c, int urg); static void showhide(Client *c); +static void sigchld(int unused); #ifndef __OpenBSD__ static int getdwmblockspid(); static void sigdwmblocks(const Arg *arg); @@ -1855,16 +1856,9 @@ setup(void) int i; XSetWindowAttributes wa; Atom utf8string; - struct sigaction sa; - /* do not transform children into zombies when they terminate */ - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); - - /* clean up any zombies (inherited from .xinitrc etc) immediately */ - while (waitpid(-1, NULL, WNOHANG) > 0); + /* clean up any zombies immediately */ + sigchld(0); signal(SIGHUP, sighup); signal(SIGTERM, sigterm); @@ -2000,6 +1994,14 @@ sigdwmblocks(const Arg *arg) #endif void +sigchld(int unused) +{ + if (signal(SIGCHLD, sigchld) == SIG_ERR) + die("can't install SIGCHLD handler:"); + while (0 < waitpid(-1, NULL, WNOHANG)); +} + +void spawn(const Arg *arg) { if (fork() == 0) { |