#include #include #include #include #include #include volatile sig_atomic_t sig = 0; char *cmd1[] = {"nc", "-l", "12345", NULL}; char *cmd2[] = {"nc", "-l", "12346", NULL}; void handle_sig(int _sig, siginfo_t *siginfo, void *ucontext) { sig = _sig; } int main(int argc, char **argv) { int p1[2], p2[2]; pid_t pid1, pid2; struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_sigaction = &handle_sig; act.sa_flags = SA_SIGINFO; sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); sigaction(SIGHUP, &act, NULL); pipe(p1); pipe(p2); switch ((pid1 = fork())) { case 0: close(0); close(1); dup2(p1[0], 0); dup2(p2[1], 1); execvp(cmd1[0], cmd1); break; default: break; } switch ((pid2 = fork())) { case 0: close(0); close(1); dup2(p2[0], 0); dup2(p1[1], 1); execvp(cmd2[0], cmd2); break; default: break; } while (wait(NULL) != -1 || errno == EINTR) { if (sig != 0) { kill(pid1, sig); kill(pid2, sig); sig = 0; } } return 0; }