dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit e7572804faa9a21a57ae298c2b153ff92d8a64ff
parent ed1bef1241334b8b0025a032b710a90223393fd1
Author: arg@localhost.localdomain <unknown>
Date:   Sat,  6 Dec 2008 09:16:48 +0000

reverted spawn
Diffstat:
Mdwm.c | 25+++++++++++--------------
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/dwm.c b/dwm.c
@@ -182,7 +182,6 @@ static void setlayout(const Arg *arg);
 static void setmfact(const Arg *arg);
 static void setup(void);
 static void showhide(Client *c);
-static void sigchld(int signal);
 static void spawn(const Arg *arg);
 static void tag(const Arg *arg);
 static int textnw(const char *text, unsigned int len);
@@ -1392,24 +1391,22 @@ showhide(Client *c) {
     }
 }
 
-
-void
-sigchld(int signal) {
-    while(0 < waitpid(-1, NULL, WNOHANG));
-}
-
 void
 spawn(const Arg *arg) {
-    signal(SIGCHLD, sigchld);
+    /* The double-fork construct avoids zombie processes and keeps the code
+     * clean from stupid signal handlers. */
     if(fork() == 0) {
-        if(dpy)
-            close(ConnectionNumber(dpy));
-        setsid();
-        execvp(((char **)arg->v)[0], (char **)arg->v);
-        fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
-        perror(" failed");
+        if(fork() == 0) {
+            if(dpy)
+                close(ConnectionNumber(dpy));
+            setsid();
+            execvp(((char **)arg->v)[0], (char **)arg->v);
+            fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
+            perror(" failed");
+        }
         exit(0);
     }
+    wait(0);
 }
 
 void