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.
			
			
This commit is contained in:
		
							parent
							
								
									348f6559ab
								
							
						
					
					
						commit
						e81f17d4c1
					
				
							
								
								
									
										8
									
								
								dwm.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								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]);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user