您的位置:首页 > 房产 > 家装 > 网站空间提供商_最新收藏五个以上的本地域名_怎么写软文推广_深圳优化网站

网站空间提供商_最新收藏五个以上的本地域名_怎么写软文推广_深圳优化网站

2025/8/21 22:10:03 来源:https://blog.csdn.net/lirendada/article/details/147380517  浏览:    关键词:网站空间提供商_最新收藏五个以上的本地域名_怎么写软文推广_深圳优化网站
网站空间提供商_最新收藏五个以上的本地域名_怎么写软文推广_深圳优化网站

SIGCHLD信号

在这里插入图片描述

​ 在学进程等待的时候我们用 waitwaitpid 函数清理僵尸进程,父进程可以阻塞等待子进程结束,也可以非阻塞地查询是否有子进程结束等待清理(也就是轮询的方式)。采用第一种方式,父进程阻塞了就不能处理自己的工作了;采用第二种方式,父进程在处理自己的工作的同时还要记得时不时地轮询一 下,程序实现复杂。

​ 其实,子进程在终止时会给父进程发 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){  // childprintf("child : %d\n", getpid());sleep(3);exit(1);}// fatherwhile(1){printf("father proc is doing some thing!\n");sleep(1);}return 0;
}

在这里插入图片描述

​ 事实上,由于 UNIX 的历史原因,要想不产生僵尸进程还有另外一种办法:父进程调用 sigactionSIGCHLD 的处理动作置为 SIG_IGN,这样 fork 出来的子进程在终止时会自动清理掉,不会产生僵尸进程,也不会通知父进程

​ 💥💥💥 此方法对于 Linux 可用,但不保证在其它 UNIX 系统上都可用

​ 下面我们来编写程序验证这样做不会产生僵尸进程:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main()
{signal(SIGCHLD, SIG_IGN); // 直接通过SIG_IGN忽略,即可回收僵尸子进程pid_t cid;if((cid = fork()) == 0){  // childprintf("child : %d\n", getpid());sleep(3);exit(1);}// fatherwhile(1){printf("father proc is doing some thing!\n");sleep(1);}return 0;
}

在这里插入图片描述

​ 除此之外,系统默认的忽略动作 Ign 和用户用 sigaction 函数自定义的忽略动作 SIG_IGN 通常是没有区别的,但这是一个特例。也就是说,SIG_IGN 其实做了更多的一些小动作!
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com