aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway/commands.c16
-rw-r--r--sway/main.c9
2 files changed, 12 insertions, 13 deletions
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 <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 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);
-}