- 论坛徽章:
- 0
|
脑子越来越笨了....哎......
1.
static void sig_handler(int signo)
{
pid_t pid;
int stat;
pid = wait(&stat);
if(pid < 0){
perror("wait() error");
exit(1);
}
printf("child %d terminated!\n", pid);
}
2.
static void sig_handler(int signo)
{
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0){
printf("child %ld terminated......\n", (long)pid);
}
}
上面是父进程处理子进程退出资源回收的两种方式,一个是用wait()等待子进程的终止,一个循环调用waitpid().
假设同时有5个子进程结束,则第一种方式只会释放一个子进程资源,另4个成为僵尸进程。
而第二种方式会回收所有5个子进程的资源。
为什么?
UNIX对信号是不排队的,当5个子进程同时结束,产生5个SIGCHLD信号,提交到父进程,父进程只看成是一个SIGCHLD信号,对吧? |
|