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 ...
随机推荐
- wepy 小程序定时器(验证码倒计时) 数据绑定页面无刷新
每次改变数据的时候记得调用 this.$apply() 验证码倒计时 使用的vant-weapp UI组件 wxml: <van-col span="10" style= ...
- Centos6.5 安装zabbix3(收藏,非原创)
1.安装PHP Zabbix 3.0对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上,注意,不支持PHP7 rpm -ivh ...
- hdu1312题解
这道题从名称来看看不出什么. 所以我们先读一下题干 There is a rectangular room, covered with square tiles. Each tile is color ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:HTML DOM 集合(Collection)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- visualVM远程监控jetty
1.打开本体bin/visualvm 2.添加远程主机 3.启动应用,使用以下方式 java -Djava.rmi.server.hostname=远程IP地址 -Dcom.sun.managemen ...
- socket实践编程1
1.服务器端程序编写 (1).socket (2).bind (3).listen (4).accept,返回值是一个fd,accept正确返回就表示我们已经和前来连接我的客户端之间建立了一个TCP连 ...
- 字符串中子序列出现次数(dp)
躲藏 链接:https://ac.nowcoder.com/acm/problem/15669来源:牛客网 题目描述 XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏. Cwbc藏在多个不区分大小写的字 ...
- PAT Basic 完美数列(25) [two pointers]
题目 给定⼀个正整数数列,和正整数p,设这个数列中的最⼤值是M,最⼩值是m,如果M <= m * p,则称这个数列是完美数列.现在给定参数p和⼀些正整数,请你从中选择尽可能多的数构成⼀个完美数列 ...
- WIFI无线协议802.11a/b/g/n/ac的演变以及区别
摘自:https://blog.csdn.net/Brouce__Lee/article/details/80956945 毫无疑问,WiFi的出现普及带给我们巨大的上网便利,所以了解一下WiFi对应 ...
- Django专题-form表单
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...