]> Skullheadx's Git Forge - dwm.git/commitdiff
restore SIGCHLD sighandler to default before spawning a program
authorHiltjo Posthuma <hiltjo@codemadness.org>
Sun, 9 Apr 2023 10:37:14 +0000 (12:37 +0200)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Sun, 9 Apr 2023 10:37:14 +0000 (12:37 +0200)
From sigaction(2):
A child created via fork(2) inherits a copy of its parent's signal dispositions.
During an execve(2), the dispositions of handled signals are reset to the default;
the dispositions of ignored signals are left unchanged.

This refused to start directly some programs from configuring in config.h:

static Key keys[] = {
MODKEY,                       XK_o,      spawn,          {.v = cmd } },
};

Some reported programs that didn't start were: mpv, anki, dmenu_extended.

Reported by pfx.
Initial patch suggestion by Storkman.

dwm.c

diff --git a/dwm.c b/dwm.c
index c2bd8710544eb4b4e7eaa4a1307e1f1dfd8d16ba..f1d86b2c7a900c9380f6d5fc1424dad1bf2ddaf8 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -1647,12 +1647,20 @@ showhide(Client *c)
 void
 spawn(const Arg *arg)
 {
+       struct sigaction sa;
+
        if (arg->v == dmenucmd)
                dmenumon[0] = '0' + selmon->num;
        if (fork() == 0) {
                if (dpy)
                        close(ConnectionNumber(dpy));
                setsid();
+
+               sigemptyset(&sa.sa_mask);
+               sa.sa_flags = 0;
+               sa.sa_handler = SIG_DFL;
+               sigaction(SIGCHLD, &sa, NULL);
+
                execvp(((char **)arg->v)[0], (char **)arg->v);
                die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
        }