signal之——异步回收机制
前言:回收子进程之前用了wait()和非阻塞模型,今天学了信号以后可以使回收机制更上一层楼,通过信号函数,父进程只需要做自己的事情,接收到信号后就触发信号函数。
信号处理函数可能会出现的bug:
1.受到停止信号也会触发SIGCHLD信号,使wait阻塞;
2.停止后继续也会触发信号,导致父进程阻塞;
3.调用sigaction(),人为发送一个SIGCHLD信号也会使父进程阻塞;
4.多个进程同时结束,可能造成回收不完全,产生僵尸进程(同中信号不排队);
解决方案的终极代码:
//异步回收子进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#define NR 40
/*
* bugs:如果多个进程同时结束 可能造成回收不完全 产生僵尸进程 (同种信号不排队)
* 循环方式waitpid解决以上bugs
*/
void waitChild(int signo)
{
pid_t pid;
printf("a sig recv:%d\n",signo);
if(signo!=SIGCHLD) return;
while(1) //保证触发一次信号,回收所有结束的子进程
{
pid=waitpid(-1,NULL,WNOHANG|WUNTRACED);//保证非阻塞,以及停止不触发信号
printf("wait child:%d\n",pid);
if(pid==0||pid==-1)
break;
}
}
int main(void)
{
pid_t pid;
#if 0
//子进程结束或停止 或者从停止到继续 发生SIGCHLD信号
if(signal(SIGCHLD,waitChild)==SIG_ERR)
{
perror("signal");
return 2;
}
#else
struct sigaction ac={.sa_handler=waitChild};//处理函数
sigemptyset(&ac.sa_mask);//不期望屏蔽其它信号
ac.sa_flags=SA_NOCLDSTOP;//进程停止时不发生SIGCHLD信号
sigaction(SIGCHLD,&ac,NULL);
#endif //
int i;
for(i=0;i<NR;i++)
{
pid=fork();
if(pid==-1) return 1;//error
else if(pid==0)//child
{
printf("%dth child <%d> start work.\n",i,getpid());
sleep(3);
printf("%dth child <%d> end work.\n",i,getpid());
exit(0);
}
}
//parent
while(1)
{
getchar();
printf("parent working....\n");
}
return 0;
}
signal之——异步回收机制的更多相关文章
- signal之——异步回收机制2
前言:上一篇的处理方法可以解决所有回收问题,但是如果我们不考虑子进程的返回状态,那么可以使内核来进行对子进程的回收 代码如下: //如果无需关心进程结束状态 可以设置子进程结束时不产生僵尸进程有内核值 ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...
- Android 操作系统的内存回收机制(转载)
Android 操作系统的内存回收机制(转载) Android APP 的运行环境 Android 是一款基于 Linux 内核,面向移动终端的操作系统.为适应其作为移动平台操作系统的特殊需要,谷歌对 ...
- Android 操作系统的内存回收机制[转]
转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/ Android APP 的运行环境 Andro ...
- Android 异步消息处理机制终结篇 :深入理解 Looper、Handler、Message、MessageQueue四者关系
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 我们知道更新UI操作我们需要在UI线程中操作,如果在子线程中更新UI会发生异常可能导致崩溃,但是在UI线程中进行耗时操作又会导致ANR,这 ...
- Android异步消息机制
Android中的异步消息机制分为四个部分:Message.Handler.MessageQueue和Looper. 其中,Message是线程之间传递的消息,其what.arg1.arg2字段可以携 ...
- 【C#复习总结】垃圾回收机制(GC)2
理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理.程序集加载.安全性.异步处理和 ...
- Android异步消息传递机制源码分析
1.Android异步消息传递机制有以下两个方式:(异步消息传递来解决线程通信问题) handler 和 AsyncTask 2.handler官方解释的用途: 1).定时任务:通过handler.p ...
随机推荐
- kube-proxy详解
KUBE_LOGTOSTDERR="--logtostderr=true"KUBE_LOG_LEVEL="--v=4"NODE_HOSTNAME="- ...
- CSS行间样式与内部样式
注释 <!-- --> 快捷键 crtl+/ div 双标签<div></div> CSS语法 属性名:属性值: Css引入方式 1.行间样式的引入:在标签中 ...
- ES6 之 函数的扩展 尾调用以及尾递归
函数参数的默认值 function log(x, y) { y = y || 'world' console.log(x + ' ' + y); } log('hello') // hello wor ...
- winform显示、隐藏任务栏及开始菜单
private const int SW_HIDE = 0; //隐藏 private const int SW_RESTORE = 9;//显示 /// <summary> /// 获取 ...
- 寒假day13
今天看了计算机网络的相关面试题
- 网鼎杯-Fakebook-反序列化和SSRF和file协议读取文件
0x00知识点:SSRF SSRF (Server-side Request Forge, 服务端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外 ...
- UVA-10074 最大子矩阵 DP
求出大矩阵里面全为0的最大子矩阵 我自己用的个挫DP写的,感觉写的不是很好,其实可以再优化,DP想法就是以 0 0 到当前 i j 为整体矩阵考虑,当前 i j就是从 i-1 j或者 i,j-1那里最 ...
- javaweb学习——session和Cookie实现购物车功能
1.创建Book类,实现对图书信息的封装. package cn.it.sessionDemo.example1; import java.io.Serializable; /** * 该类实现对图书 ...
- 17。3.12---re模块--正则表达式操作指南
1----python re模块(Regular Expressioin正则表达式)提供了一个与perl等编程语言类似的正则匹配操作,他是一个处理python字符串的强有力的工具,有自己的语法和独立的 ...
- 编程基础-servlet1
1.Servelet是什么 sevlet是Server与Applet 的缩写,即服务端小程序.Sun公司提供的开发动态web资源的技术. servelet本质是java类,但遵循Servlet规范,没 ...