#include #include #include #include #include #include int run() { struct termios tt; sigset_t sigset; pid_t pid; struct pollfd pfd[2]; int running = 1; tcgetattr(STDIN_FILENO, &tt); tt.c_lflag &= ~(ECHO|ICANON|ISIG); tcsetattr(STDIN_FILENO, TCSANOW, &tt); pid = fork(); if (pid == 0) { /* Child */ usleep(100000); return 0; } printf("Start: %d\n", pid); sigemptyset(&sigset); sigaddset(&sigset, SIGCHLD); sigprocmask(SIG_BLOCK, &sigset, NULL); pfd[0].fd = STDIN_FILENO; pfd[0].events = POLLIN; pfd[1].fd = signalfd(-1, &sigset, 0); pfd[1].events = POLLIN; do { poll(pfd, 2, -1); if (pfd[0].revents & POLLIN) { char c; int ret = read(pfd[0].fd, &c, 1); if (ret == 0 || c == 'q' || c == '\003') { running = 0; break; } } if (pfd[1].revents & POLLIN) { struct signalfd_siginfo info; int ret = read(pfd[1].fd, &info, sizeof(info)); if (ret) printf("Signal: %d\r\n", info.ssi_signo); if (info.ssi_signo == SIGCHLD) break; } } while (1); waitpid(pid, NULL, 0); printf("End: %d\n", pid); tcgetattr(STDIN_FILENO, &tt); tt.c_lflag |= ECHO|ICANON|ISIG; tcsetattr(STDIN_FILENO, TCSANOW, &tt); return running; } int main() { while (run()); return 0; }