summaryrefslogtreecommitdiff
path: root/dwm.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwm.c')
-rw-r--r--dwm.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/dwm.c b/dwm.c
index df45a64..3c0afbf 100644
--- a/dwm.c
+++ b/dwm.c
@@ -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) {