|
|
@@ -205,7 +205,6 @@ 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);
|
|
|
static void spawn(const Arg *arg);
|
|
|
static void tag(const Arg *arg);
|
|
|
static void tagmon(const Arg *arg);
|
|
|
@@ -1543,9 +1542,16 @@ setup(void)
|
|
|
int i;
|
|
|
XSetWindowAttributes wa;
|
|
|
Atom utf8string;
|
|
|
+ struct sigaction sa;
|
|
|
|
|
|
- /* clean up any zombies immediately */
|
|
|
- sigchld(0);
|
|
|
+ /* 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);
|
|
|
|
|
|
/* init screen */
|
|
|
screen = DefaultScreen(dpy);
|
|
|
@@ -1638,14 +1644,6 @@ showhide(Client *c)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-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)
|
|
|
{
|