Merge pull request #190 from taiyu-len/master
#187, let init handle child processes
This commit is contained in:
commit
73af58152b
|
@ -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…
Reference in a new issue