linux的SIGCHLD信号
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信号相关推荐
- 【Linux】SIGCHLD信号
文章目录 SIGCHLD信号 SIGCHLD信号 回忆: 为了避免出现僵尸进程,父进程需要使用wait或waitpid函数等待子进程结束,父进程可以阻塞等待子进程结束,也可以非阻塞地查询的是否有子进程 ...
- 【Linux】SIGCHLD信号解决僵尸进程问题
1. 基本信息 SIGCHLD信号产生的条件: 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 以上三种条件都会给父进程发送SIGCHLD信号,父进 ...
- linux下的僵尸进程处理SIGCHLD信号【转】
转自:http://www.cnblogs.com/wuchanming/p/4020463.html 什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打 ...
- Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...
- [ Linux ] 可重入函数,volatile 关键字,SIGCHLD信号
目录 1.可重入函数 2.volatile 2.1从信号角度理解volatile的作用 2.2volatile的作用 3.SIGCHLD信号 3.1SIGCHLD信号的验证 1.可重入函数 在数据结构 ...
- Day53 Linux setitimer函数 信号集操作函数 信号捕捉 SIGCHLD信号
目录 setitimer函数 信号集操作函数 1.信号集设定 2.igprocmask函数 3.sigpending函数 信号捕捉 1.signal函数 2.sigaction函数 SIGCHLD信号 ...
- Linux解决僵尸进程的几种方式,SIGCHLD信号设置SIG_IGN处理方式等
目录 僵尸进程 解决方式 父进程阻塞调用wait() 父进程非阻塞调用waitpid() SIGCHLD信号 SIG_IGN信号 僵尸进程 我们知道linux下进程有种状态叫做僵尸状态; 原因是父进程 ...
- 【Linux信号专题】五、SIGCHLD信号详解
欢迎关注博主 Mindtechnist 或加入[Linux C/C++/Python社区]一起探讨和分享Linux C/C++/Python/Shell编程.机器人技术.机器学习.机器视觉.嵌入式AI ...
- linux下的僵尸进程处理SIGCHLD信号
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
最新文章
- 个人银行账户管理程序
- 如何在arXiv上发表一篇文章
- 团队愿景和团队章程的问答?
- 软 件 学 院 实践环节报告
- 三方面搞定http协议之“状态码”
- 实现iframe_面试官:来说说单点登录的三种实现方式
- filebeat 笔记
- 百度实习笔试题(2012.5.6)
- 代码从GCC到MSVC的移植
- Unity Editor Toolbar 编辑器扩展
- linux中如何只拷贝文件夹下的文件,而不包括其子文件夹
- SRCNN论文翻译(Image Super-Resolution Using Deep Convolutional Networks)
- 教务管理系统登陆显示不出验证码图片求哥帮助一下
- html背景色不透明度,css怎么设置颜色不透明度?
- 游戏开发记录--敌人追寻玩家
- Markdown中图片左对齐
- Windows——卸载MinGW的方法
- 德鲁克《卓有成效的管理者》学习笔记-掌握时间的学习和实践
- 嵌入式计算机答辩标准,陈月昆答辩公告
- 数字图像处理-图像形态学处理-颗粒提取
热门文章
- anaconda3配置python2.7环境_Anaconda3+python3环境下如何创建python2环境(win+Linux下适用,同一个anaconda下py2/3共存)...
- Java 编写捕鱼达人游戏 窗体程序 完整源码
- 怎么把手机文件导入华为云服务器,华为手机如何上传数据到云服务器
- 简单实现你想数字电脑猜的小游戏
- 调用百度网盘开放平台接口,操作百度网盘中的文件,上传、下载等
- 自用房屋租住管理系统
- html页面用excel打印,excel怎么打印不能全部显示出来
- idcardweb装入失败_卡巴斯基安装错误的解决办法
- 软件测试知识点和面试题--app测试篇
- 还原SQL Server数据库