#187, let init handle child processes

master
taiyu 9 years ago
parent d2680ac8fe
commit 18f4905e62

@ -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;
}

@ -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);
}

Loading…
Cancel
Save