子进程死亡会给父进程发送 SIGCHLD 信号!(默认动作:父进程忽略该信号)此时父进程就可以捕捉该信号,利用回调函数使用 waitpid 回收子进程。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
void catch_sig(int sig) // 参数:是捕捉的信号编号
{pid_t pid;
while(1)
{pid = waitpid(-1, NULL, WNOHANG);if(pid <= 0)
{break;}printf("died child_id=%d\n",pid);} }
int main()
{// 问题:父进程注册捕捉的时候,子进程已经死亡,这样信号根本捕捉不到// 重要思想:先屏蔽信号,再解除屏蔽// 这样:即使子进程先死,内核产生的信号也会被屏蔽掉,然后再解除屏蔽,信号就可以被顺利捕捉了// 父进程先设置屏蔽信号集,屏蔽SIGCHLD信号sigset_t proc; // 定义自定义信号集sigemptyset(&proc); // 第一步:清空自定义信号集,防止随机数干扰其他信号sigaddset(&proc, SIGCHLD); // 将 sigchld 信号 添加到自定义集合sigprocmask(SIG_BLOCK, &proc, NULL); // 通过 自定义信号集 设置 屏蔽信号集// 创建5个子进程
int i = 0;
for(i = 0 ;i < 5; i ++)
{pid_t pid = fork();if(pid == 0){break;}}// 此时,6个进程在运行if(i < 5){// 子进程printf("I am %d child, mypid=%d\n", i+1, getpid());}else if(i == 5){// 父进程逻辑 前期已经将信号屏蔽掉了,此时使用 sigaction 进行捕捉struct sigaction act;act.sa_flags = 0;act.sa_handler = catch_sig;sigemptyset(&act.sa_mask); // 不设置临时屏蔽信号sigaction(SIGCHLD, &act, NULL);
// 注意:先注册捕捉,再解除屏蔽,顺序不能反sigprocmask(SIG_UNBLOCK, &proc, NULL);while(1){sleep(1); // 父进程一直存活,使子进程先执行return死亡}}return 0;
}

Linux学习之系统编程篇:利用 SIGCHLD 回收子进程相关推荐

  1. Linux学习之系统编程篇:进程回收(wait / waitpid)

    一.wait wait 函数 :阻塞函数,使进程一直处于等待状态,直至进程死亡. (1)头文件: #include <sys/types.h> #include <sys/wait. ...

  2. Linux学习之系统编程篇:mmap练习

    一.利用 mmap 读取磁盘文件内容 // 需求:将文件传入内存映射区,然后输出至屏幕 #include <stdio.h> #include <unistd.h> #incl ...

  3. Linux学习之系统编程篇:利用 setitimer 实现 alarm练习

    #include <unistd.h> #include <stdio.h> #include <signal.h> #include <sys/time.h ...

  4. Linux学习之系统编程篇:利用 shm 进行进程间通信

    一.写进程 shm_w.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...

  5. Linux学习之系统编程篇:利用管道进行进程间通信

    这里我们先补充一个小知识: 父子进程使用 pipe 进行通信时fork 和 pipe 先后的顺序是先 pipe,后 fork,因为父进程先创建管道,再 fork 创建子进程,这样才能是父子进程共享一块 ...

  6. Linux学习之系统编程篇:对线程的基本认识

    (1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...

  7. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  8. Linux学习之系统编程篇:编写一个守护进程

    需求:写一个守护进程,每隔 2s 获取一次系统时间,将这个时间写入到磁盘文件 #include <stdio.h> #include <stdlib.h> #include & ...

  9. Linux学习之系统编程篇:守护进程(精灵进程、后台进程)

    一.背景 一般情况下,启动终端(shell),系统会创建一个会话(shell 进程是会长),经过后续各种操作,该会话中会存在多个进程组,每个进程组中也会有多个进程(父进程是组长),若此时关闭 shel ...

最新文章

  1. 为什么Python在数据科学领域比R更受欢迎呢?
  2. 韩国最新「美女元宇宙」引爆Reddit!最强换脸神器美女自拍一键转漫画
  3. android httpClient 支持HTTPS的访问方式
  4. 最小堆实现优先队列:Python实现
  5. 考研数学线上笔记(三):凯哥定积分、棍哥二重积分计算系列课程
  6. visio业务流程图教学_用visio软件怎样画数据流程图和业务流程图?
  7. JavaEE下宠物领养网站的设计与实现
  8. 云计算计算机二级,全国计算机等级考试二级MS+Office高级应用真题题库2+2020年3月-20210613095444.pdf-原创力文档...
  9. 【考试总结贴】控制测量学
  10. 1071svm函数 r语言,科学网—R中的svm - 吴锐的博文
  11. vdi转vmdk VirtualBox与VMware硬盘格式转换及使用方法
  12. html5设置全屏背景图,HTML5 body设置全屏背景图片 如何让body的背景图片自适应整个屏----实战经验...
  13. 如何用divi主题做独立站?
  14. 微信小程序-房屋设施图标
  15. 测试Java测试Java测试Java
  16. Freemarker语法2
  17. 渗透测试之漏洞检测篇
  18. 物联网将IT安全推向边缘
  19. 全景图转小行星视角投影原理详解
  20. HTTP协议和资源下载

热门文章

  1. 亚马逊提出无监督虚拟增强句子表征学习框架,效果超越SimCSE
  2. 直播 | CMU博士后刘鹏飞:文本生成任务十大发展趋势(2020-2021)
  3. 机器知道哪吒是部电影吗?解读阿里巴巴概念图谱AliCG
  4. 无监督领域迁移及文本表示学习的相关进展
  5. 直播预告 | 旷视科技李彦玮:动态网络及其在场景分割中的应用
  6. Wasserstein距离在生成模型中的应用
  7. php ini include,php.ini文件中的include_path设置
  8. php中round函数能给整数用吗,PHP四舍五入、取整、round函数使用
  9. 功能测试——房屋租赁系统(Selenium IDE)
  10. zookeeper分布式锁代码实例