URI: 
       restore SIGCHLD sighandler to default before spawning a program - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e81f17d4c196aaed6893fd4beed49991caa3e2a4
   DIR parent 348f6559ab0d4793db196ffa56ba96ab95a594a6
  HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun,  9 Apr 2023 12:37:14 +0200
       
       restore SIGCHLD sighandler to default before spawning a program
       
       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.
       
       Diffstat:
         M dwm.c                               |       8 ++++++++
       
       1 file changed, 8 insertions(+), 0 deletions(-)
       ---
   DIR diff --git 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]);
                }