diff options
author | Marius Halden <marius.h@lden.org> | 2015-10-29 01:05:30 +0100 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2015-10-29 01:05:30 +0100 |
commit | 0003b01dbcfbf68119127a2899f3277cd676f2c3 (patch) | |
tree | 1f5f19aa5fd594259bf09de66801501c3cd17027 /piper.c | |
parent | 9be0faf753d559164949c6bf4545028960f4c8cc (diff) | |
download | piper-0003b01dbcfbf68119127a2899f3277cd676f2c3.tar.gz piper-0003b01dbcfbf68119127a2899f3277cd676f2c3.tar.bz2 piper-0003b01dbcfbf68119127a2899f3277cd676f2c3.tar.xz |
Update some of the logic
Diffstat (limited to 'piper.c')
-rw-r--r-- | piper.c | 58 |
1 files changed, 42 insertions, 16 deletions
@@ -40,6 +40,9 @@ reap_all() if (procs[i].pid != -1) kill(procs[i].pid, SIGKILL); } + + while (wait(NULL) != -1 || errno == EINTR) + ; } void @@ -170,6 +173,18 @@ signal_procs() sendsignal = 0; } +/*int +check_pid_running(pid_t pid) +{ + if (pid == -1) + return 0; + + if (kill(pid, 0) == -1) + return 0; + else + return 1; +}*/ + void handle_nonfatal(int sig, siginfo_t *siginfo, void *ucontext) { @@ -183,14 +198,9 @@ handle_fatal(int sig, siginfo_t *siginfo, void *ucontext) sendsignal = sig; } -int -main(int argc, char **argv) +void +setup_signals() { - if (argc < 2) { - fprintf(stderr, "Usage: piper <cmd1> <cmd2>\n"); - return 1; - } - struct sigaction act; memset(&act, 0, sizeof(act)); @@ -209,6 +219,27 @@ main(int argc, char **argv) err(1, "sigaction"); if (sigaction(SIGUSR2, &act, NULL) == -1) err(1, "sigaction"); +} + +void +start_missing_procs() +{ + int i; + for (i = 0; i < NUM_PROCS; i++) { + if (procs[i].pid == -1) + run_cmd(&procs[i]); + } +} + +int +main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "Usage: piper <cmd1> <cmd2>\n"); + return 1; + } + + setup_signals(); procs[0].cmd = strdup(argv[1]); if (procs[0].cmd == NULL) @@ -234,17 +265,15 @@ main(int argc, char **argv) procs[0]._stderr = fds[1]; procs[1]._stdin = fds[0]; - run_cmd(&procs[0]); - run_cmd(&procs[1]); - - while (have_child()) { - int status; + while (!terminate) { pid_t pid; + start_missing_procs(); + if (sendsignal != 0) signal_procs(); - pid = wait(&status); + pid = wait(NULL); if (pid == -1) { if (errno == EINTR) continue; @@ -256,9 +285,6 @@ main(int argc, char **argv) if (p == NULL) continue; // XXX: Log something here? p->pid = -1; - - if (!terminate) - run_cmd(p); } return 0; |