From 18f4905e62e1fb2042abd79b2a4c756187e3d506 Mon Sep 17 00:00:00 2001
From: taiyu <taiyu.len@gmail.com>
Date: Thu, 8 Oct 2015 08:12:31 -0700
Subject: [PATCH] #187, let init handle child processes

---
 sway/commands.c | 16 ++++++++++++----
 sway/main.c     |  9 ---------
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/sway/commands.c b/sway/commands.c
index 03c682d7b..2358b9e93 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -9,6 +9,7 @@
 #include <unistd.h>
 #include <ctype.h>
 #include <sys/types.h>
+#include <sys/wait.h>
 #include "stringop.h"
 #include "layout.h"
 #include "focus.h"
@@ -190,18 +191,25 @@ static enum cmd_status cmd_exec_always(int argc, char **argv) {
 	char cmd[4096];
 	strcpy(cmd, tmp);
 	free(tmp);
-	
-	char *args[] = {"sh", "-c", cmd, 0 };
 	sway_log(L_DEBUG, "Executing %s", cmd);
 
 	pid_t pid;
+	// Fork process
 	if ((pid = fork()) == 0) {
-		execv("/bin/sh", args);
-		_exit(-1);
+		// Fork child process again
+		setsid();
+		if (fork() == 0) {
+			execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL);
+			/* Not reached */
+		}
+		// Close child process
+		_exit(0);
 	} else if (pid < 0) {
 		sway_log(L_ERROR, "exec command failed, sway could not fork");
 		return CMD_FAILURE;
 	}
+	// cleanup child process
+	wait(0);
 	return CMD_SUCCESS;
 }
 
diff --git a/sway/main.c b/sway/main.c
index 669211840..de17f4406 100644
--- a/sway/main.c
+++ b/sway/main.c
@@ -22,8 +22,6 @@ void sway_terminate(void) {
 	wlc_terminate();
 }
 
-static void sigchld_handle(int signal);
-
 static void wlc_log_handler(enum wlc_log_type type, const char *str) {
 	if (type == WLC_LOG_ERROR) {
 		sway_log(L_ERROR, "[wlc] %s", str);
@@ -64,9 +62,6 @@ int main(int argc, char **argv) {
 		{0, 0, 0, 0}
 	};
 
-	/* Signal handling */
-	signal(SIGCHLD, sigchld_handle);
-
 	setenv("WLC_DIM", "0", 0);
 
 	wlc_log_set_handler(wlc_log_handler);
@@ -153,7 +148,3 @@ int main(int argc, char **argv) {
 	return 0;
 }
 
-void sigchld_handle(int signal) {
-	(void) signal;
-	while (waitpid((pid_t)-1, 0, WNOHANG) > 0);
-}