diff --git a/sway/commands.c b/sway/commands.c index 03c682d7..2358b9e9 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -9,6 +9,7 @@ #include #include #include +#include #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 66921184..de17f440 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); -}