SIGCHLD waitpid, 小心子进程结束事件被偷了
原本项目中依赖子进程执行的地方,都使用jni调用java层的ProcessManager,换了c++ACE框架后,发现这些任务都很慢,调试才发现所有子进程执行的任务都必须等待到reactor超时才返回控制权。一时慌了居然怀疑是不是app进程没有收到SIGCHLD信号,所以调试跟踪了一下内核,信号正常。
既然收到了信号,那么去了哪里呢?
这里要说明一下ACE框架, ACE_Process_Manager会在handle_signal处理SIGCHLD信号,然后向reactor发一个notify,从而进入它的handle_input,在这里ACE_Process_Manager再通过waitpid查询出子进程号,从handler表中找出对应的handler,最后执行handler->handle_exit()。
SIGCHLD也就是子进程结束向父进程发的信号,并且在你进程某个队列挂入一个事件,这个事件可以通过waitpid系统调用查询WHOHANG,但这个事件在被waitpid就不存在了。一般的组合使用方式,在signal处理函数中调用waitpid取事件。而ACE框架的ACE_Process_Manager也是这样搭配使用,只不过waitpid延后到一个notify事件中进行。
好了回到本例,在这过程中,waitpid一直都返回0,表示没有这个事件,ACE框架必须依赖这个事件。这就奇怪了,有SIGCHLD信号却waitpid没有事件,(可参看一下https://stackoverflow.com/questions/43949142/will-wait-and-waitpid-block-sigchld-and-unblock-it-when-they-return-in-linux)。开始以为是android linux有问题,一直苦闷调试。最后当断点了waitpid后,一下子就明朗了,原来jni使用了java层的ProcessManager包,java虚拟机开了一个线程在wait4进而waitpid。
当子进程结束时,挂载到父进程也就是app进程的事件,先被art虚拟机用waitpid取出了。然后才到SIGCHLD信号处理,当ACE框架走到waitpid一步时,事件已经被art虚拟机偷走了,所以被耍了一转。
转载于:https://www.cnblogs.com/bbqzsl/p/7780219.html
SIGCHLD waitpid, 小心子进程结束事件被偷了相关推荐
- 利用SIGCHLD信号回收子进程
子进程执行结束之后,父进程如果不对其进行回收,子进程就会变为僵尸进程. 父进程可以通过调用wait()函数和waitpid()函数去回收子进程. 由于子进程结束时会发送SIGCHLD信号给父进程,不过 ...
- 009exec函数wait、waitpid回收子进程
LINUX系统编程学习笔记 exec 子程序跳转,wait.waitpid 回收子程序 1. exec 函数族 1.1 exec 作用 1.2 exec 函数族头文件包含及声明 1.3 exec 函数 ...
- SIGCHLD信号回收子进程
SIGCHLD信号回收子进程 代码 问题 注意点 代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h ...
- Linux进程3:父进程等待(wait,waitpid)子进程退出并收集子进程退出状态,僵尸进程
父进程等待(wait,waitpid)子进程退出并收集子进程退出状态 1.父进程为什么要等待子进程退出? 创建子进程目的:------干活 我们要知道干活结束没. 子进程退出状态不被收集,变成僵尸进程 ...
- 父进程等待子进程结束
from multiprocessing import Process import time # def task(name): # print("%s start" % nam ...
- java 事件cancel_Activiti结束事件(End Event)
Activiti结束事件(End Event) 作者:Jesai -2017.08.03T01:03 曾经,黑夜多么漫长,八月雨扰眠,缘何? 声明:版权所有,如需引用请注明出处,如发现抄袭,必追究法律 ...
- 复习步骤12- 16 BPMN事件(3)结束事件
结束事件: --按照事件的位置,开始事件一般都市捕获事件,结束时间一般都是抛出事件 无指定结束事件 -- 什么都没指定直接就结束掉了 错误结束事件 -- 往往和错误边界事件或错误开始事件一起使用 ...
- 仿热血江湖帮战客方血帮战 开始对战记时器结束事件
public void timer_1_Elapsed(object sender, ElapsedEventArgs e) { if (GClass4.int ...
- 仿热血江湖帮战客方血帮战 准备记时器结束事件
public void timer_0_Elapsed(object sender, ElapsedEventArgs e) { if (GClass4.int ...
最新文章
- R语言计算平均值的标准误差(standard error of the mean):自定义函数计算平均值的标准误差、使用plotrix包的std.error函数计算平均值的标准误差
- Winform-DataGridView
- tos win10打开ip_win 10 系统 Docker 的安装和使用
- java进制原码_Java 一一 进制、原码 反码 补码、移位操作
- scala 主构造函数_Scala-构造函数
- struct1标签使用方法笔记
- 07 设置View的显示与隐藏
- 加速前进!华为已在全球多地注册“鸿蒙”商标
- excel怎么设置自动计算_Excel工作进度表,自动甘特进度图,函数计算简单实用...
- 下载并还原AdventureWorksDW2012数据库
- mysql identify_MySQL用户授权
- 初秋进补 粥汤大对决
- Java——批量更改图片像素(大小)
- c语言素数筛法与分解素因数,质因数分解及代码:
- 机器学习入门:准备知识笔记(seaborn及案例)
- 治愈系插画PSD源文件+笔刷分享
- [BUUCTF]PWN17——[HarekazeCTF2019]baby_rop
- 【干货】麦肯锡七步成诗解决问题方法最新原版课件.pdf(附下载链接)
- 10 | 生产者压缩算法面面观
- 英语期刊写作-通往国际学术舞台的阶梯第三章答案
热门文章
- 用数组建立二叉树(LeetCode二叉树测试)
- 最简单的基于FFmpeg的移动端例子:Android HelloWorld
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
- python画正方形并涂色_关于python使用cv画矩形并填充颜色同时填充文字
- linux下无对应分辨率,linux mint 向“显示(display)”面板添加没有提供的分辨率选项,使虚拟机中的linux mint可以全屏显示...
- python热力图美化_python如何画热力图?
- 【服务器】【个人网盘】宝塔搭建cloudreve
- NYOJ813 - 对决
- fj怎么样_评测:丰田FJ 酷路泽动力及性能怎么样是否值得入手
- uml边界类例子_面向对象UML笔记