📄 p8-16.c
字号:
#include <signal.h>#include <stdio.h>#include <sys/wait.h>#define ANYKID -1 /* waitpid的第一个参数是 -1, 则等待任意子进程 */#define NUMKIDS 4static void handler(int);volatile sig_atomic_t kids = NUMKIDS;int main(void){ int i; pid_t pid; struct sigaction act; sigset_t set, emptyset; /* 指定信号动作 */ act.sa_handler = handler; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGCHLD); /* 信号执行期间阻塞 SIGCHLD信号 */ act.sa_flags = 0; sigaction(SIGCHLD, &act, NULL); sigemptyset(&emptyset); sigemptyset(&set); /* 将SIGCHLD加入至信号屏蔽 */ sigaddset(&set, SIGCHLD); sigprocmask(SIG_BLOCK, &set, NULL); setbuf(stdout, NULL); for (i = 0; i < NUMKIDS; i++) { if (fork() == 0) { printf("Child %d\n", getpid()); exit(0); } } while (kids > 0) sigsuspend(&emptyset); /* 查看被阻塞的信号 */}/*static void handler(int sig){ pid_t pid; int status; pid = waitpid(ANYKID, &status, WNOHANG); kids--; printf("...child %d, now %d left\n", pid, kids);}*/static void handler(int sig){ pid_t pid; int status; printf("Parent (%d) in handler, ", getpid()); pid = waitpid(ANYKID, &status, WNOHANG); while (pid > 0) { kids--; printf("child %d, now %d left\n", pid, kids); pid = waitpid(ANYKID, &status, WNOHANG); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -