SIGCHLD信号

SIGCHLD的产生条件

子进程终止时

子进程接收到SIGSTOP信号停止时

子进程处在停止态,接受到SIGCONT后唤醒时

借助SIGCHLD信号回收子进程

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>void sys_err(char *str)
{perror(str);exit(1);
}void do_sig_child(int signo)
{int status;pid_t pid;//    if ((pid = waitpid(0, &status, WNOHANG)) > 0) {while ((pid = waitpid(0, &status, WNOHANG)) > 0) {if (WIFEXITED(status))printf("------------child %d exit %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("child %d cancel signal %d\n", pid, WTERMSIG(status));}
}int main(void)
{pid_t pid;int i;//阻塞SIGCHLDfor (i = 0; i < 10; i++) {if ((pid = fork()) == 0)break;else if (pid < 0)sys_err("fork");}if (pid == 0) {     //10个子进程int n = 1;while (n--) {printf("child ID %d\n", getpid());sleep(1);}return i+1;} else if (pid > 0) {//SIGCHLD阻塞struct sigaction act;act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGCHLD, &act, NULL);//解除对SIGCHLD的阻塞while (1) {printf("Parent ID %d\n", getpid());sleep(1);}}return 0;
}

分析该例子。结合 17)SIGCHLD 信号默认动作,掌握父使用捕捉函数回收子进程的方式。 【sigchild.c】

如果每创建一个子进程后不使用sleep可以吗?可不可以将程序中,捕捉函数内部的while替换为if?为什么?

if ((pid = waitpid(0, &status, WNOHANG)) > 0) { ... }

思考:信号不支持排队,当正在执行SIGCHLD捕捉函数时,再过来一个或多个SIGCHLD信号怎么办?

子进程结束status处理方式

pid_t waitpid(pid_t pid, int *status, int options)

options

WNOHANG

没有子进程结束,立即返回

WUNTRACED

如果子进程由于被停止产生的SIGCHLD,waitpid则立即返回

WCONTINUED

如果子进程由于被SIGCONT唤醒而产生的SIGCHLD,waitpid则立即返回

获取status

WIFEXITED(status)

子进程正常exit终止,返回真

WEXITSTATUS(status)返回子进程正常退出值

WIFSIGNALED(status)

子进程被信号终止,返回真

WTERMSIG(status)返回终止子进程的信号值

WIFSTOPPED(status)

子进程被停止,返回真

WSTOPSIG(status)返回停止子进程的信号值

WIFCONTINUED(status)

SIGCHLD信号注意问题

1. 子进程继承了父进程的信号屏蔽字和信号处理动作,但子进程没有继承未决信号集spending。

2. 注意注册信号捕捉函数的位置。

3. 应该在fork之前,阻塞SIGCHLD信号。注册完捕捉函数后解除阻塞。

linux的SIGCHLD信号相关推荐

  1. 【Linux】SIGCHLD信号

    文章目录 SIGCHLD信号 SIGCHLD信号 回忆: 为了避免出现僵尸进程,父进程需要使用wait或waitpid函数等待子进程结束,父进程可以阻塞等待子进程结束,也可以非阻塞地查询的是否有子进程 ...

  2. 【Linux】SIGCHLD信号解决僵尸进程问题

    1. 基本信息 SIGCHLD信号产生的条件: 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 以上三种条件都会给父进程发送SIGCHLD信号,父进 ...

  3. linux下的僵尸进程处理SIGCHLD信号【转】

    转自:http://www.cnblogs.com/wuchanming/p/4020463.html 什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打 ...

  4. Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号

    首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...

  5. [ Linux ] 可重入函数,volatile 关键字,SIGCHLD信号

    目录 1.可重入函数 2.volatile 2.1从信号角度理解volatile的作用 2.2volatile的作用 3.SIGCHLD信号 3.1SIGCHLD信号的验证 1.可重入函数 在数据结构 ...

  6. Day53 Linux setitimer函数 信号集操作函数 信号捕捉 SIGCHLD信号

    目录 setitimer函数 信号集操作函数 1.信号集设定 2.igprocmask函数 3.sigpending函数 信号捕捉 1.signal函数 2.sigaction函数 SIGCHLD信号 ...

  7. Linux解决僵尸进程的几种方式,SIGCHLD信号设置SIG_IGN处理方式等

    目录 僵尸进程 解决方式 父进程阻塞调用wait() 父进程非阻塞调用waitpid() SIGCHLD信号 SIG_IGN信号 僵尸进程 我们知道linux下进程有种状态叫做僵尸状态; 原因是父进程 ...

  8. 【Linux信号专题】五、SIGCHLD信号详解

    欢迎关注博主 Mindtechnist 或加入[Linux C/C++/Python社区]一起探讨和分享Linux C/C++/Python/Shell编程.机器人技术.机器学习.机器视觉.嵌入式AI ...

  9. linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...

最新文章

  1. 个人银行账户管理程序
  2. 如何在arXiv上发表一篇文章
  3. 团队愿景和团队章程的问答?
  4. 软 件 学 院 实践环节报告
  5. 三方面搞定http协议之“状态码”
  6. 实现iframe_面试官:来说说单点登录的三种实现方式
  7. filebeat 笔记
  8. 百度实习笔试题(2012.5.6)
  9. 代码从GCC到MSVC的移植
  10. Unity Editor Toolbar 编辑器扩展
  11. linux中如何只拷贝文件夹下的文件,而不包括其子文件夹
  12. SRCNN论文翻译(Image Super-Resolution Using Deep Convolutional Networks)
  13. 教务管理系统登陆显示不出验证码图片求哥帮助一下
  14. html背景色不透明度,css怎么设置颜色不透明度?
  15. 游戏开发记录--敌人追寻玩家
  16. Markdown中图片左对齐
  17. Windows——卸载MinGW的方法
  18. 德鲁克《卓有成效的管理者》学习笔记-掌握时间的学习和实践
  19. 嵌入式计算机答辩标准,陈月昆答辩公告
  20. 数字图像处理-图像形态学处理-颗粒提取

热门文章

  1. anaconda3配置python2.7环境_Anaconda3+python3环境下如何创建python2环境(win+Linux下适用,同一个anaconda下py2/3共存)...
  2. Java 编写捕鱼达人游戏 窗体程序 完整源码
  3. 怎么把手机文件导入华为云服务器,华为手机如何上传数据到云服务器
  4. 简单实现你想数字电脑猜的小游戏
  5. 调用百度网盘开放平台接口,操作百度网盘中的文件,上传、下载等
  6. 自用房屋租住管理系统
  7. html页面用excel打印,excel怎么打印不能全部显示出来
  8. idcardweb装入失败_卡巴斯基安装错误的解决办法
  9. 软件测试知识点和面试题--app测试篇
  10. 还原SQL Server数据库