admin管理员组文章数量:1438746
【进程信号拓展】SIG
SIGCHLD信号
在学进程等待的时候我们用 wait
和 waitpid
函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一 下,程序实现复杂。
其实,子进程在终止时会给父进程发 SIGCHLD
信号,该信号的默认处理动作是忽略,父进程可以自定义 SIGCHLD
信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用 wait
清理子进程即可。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void handler(int signo)
{
pid_t id = waitpid(-1, NULL, WNOHANG); // 使用WNOHANG才能保证非阻塞查询
while(id > 0)
{
printf("wait child success: %d\n", id);
}
printf("child is quit! %d\n", getpid());
}
int main()
{
signal(SIGCHLD, handler); // 将SIGCHLD信号进行自定义捕捉
pid_t cid = fork();
if(cid == 0)
{
// child
printf("child : %d\n", getpid());
sleep(3);
exit(1);
}
// father
while(1)
{
printf("father proc is doing some thing!\n");
sleep(1);
}
return 0;
}
事实上,由于 UNIX
的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调用 sigaction
将 SIGCHLD
的处理动作置为 SIG_IGN
,这样 fork
出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程。
本文标签: 进程信号拓展SIG
版权声明:本文标题:【进程信号拓展】SIG 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1747589169a2720113.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论