diff options
| author | arg@localhost.localdomain <unknown> | 2008-12-06 09:16:48 +0000 | 
|---|---|---|
| committer | arg@localhost.localdomain <unknown> | 2008-12-06 09:16:48 +0000 | 
| commit | e7572804faa9a21a57ae298c2b153ff92d8a64ff (patch) | |
| tree | b02a0ec1d467412b6395622447412d4ff0b45427 | |
| parent | ed1bef1241334b8b0025a032b710a90223393fd1 (diff) | |
| download | dwm-e7572804faa9a21a57ae298c2b153ff92d8a64ff.tar.gz | |
reverted spawn
| -rw-r--r-- | dwm.c | 25 | 
1 files changed, 11 insertions, 14 deletions
| @@ -182,7 +182,6 @@ static void setlayout(const Arg *arg);  static void setmfact(const Arg *arg);  static void setup(void);  static void showhide(Client *c); -static void sigchld(int signal);  static void spawn(const Arg *arg);  static void tag(const Arg *arg);  static int textnw(const char *text, unsigned int len); @@ -1392,24 +1391,22 @@ showhide(Client *c) {  	}  } - -void -sigchld(int signal) { -	while(0 < waitpid(-1, NULL, WNOHANG)); -} -  void  spawn(const Arg *arg) { -	signal(SIGCHLD, sigchld); +	/* The double-fork construct avoids zombie processes and keeps the code +	 * clean from stupid signal handlers. */  	if(fork() == 0) { -		if(dpy) -			close(ConnectionNumber(dpy)); -		setsid(); -		execvp(((char **)arg->v)[0], (char **)arg->v); -		fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); -		perror(" failed"); +		if(fork() == 0) { +			if(dpy) +				close(ConnectionNumber(dpy)); +			setsid(); +			execvp(((char **)arg->v)[0], (char **)arg->v); +			fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); +			perror(" failed"); +		}  		exit(0);  	} +	wait(0);  }  void | 
