restore SIGCHLD sighandler to default before spawning a program e81f17d4
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.
Hiltjo Posthuma · 2023-04-09 12:37 1 file(s) · +8 −0
dwm.c +8 −0
1647 1647
void
1648 1648
spawn(const Arg *arg)
1649 1649
{
1650 +
	struct sigaction sa;
1651 +
1650 1652
	if (arg->v == dmenucmd)
1651 1653
		dmenumon[0] = '0' + selmon->num;
1652 1654
	if (fork() == 0) {
1653 1655
		if (dpy)
1654 1656
			close(ConnectionNumber(dpy));
1655 1657
		setsid();
1658 +
1659 +
		sigemptyset(&sa.sa_mask);
1660 +
		sa.sa_flags = 0;
1661 +
		sa.sa_handler = SIG_DFL;
1662 +
		sigaction(SIGCHLD, &sa, NULL);
1663 +
1656 1664
		execvp(((char **)arg->v)[0], (char **)arg->v);
1657 1665
		die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
1658 1666
	}