原本项目中依赖子进程执行的地方,都使用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, 小心子进程结束事件被偷了相关推荐

  1. 利用SIGCHLD信号回收子进程

    子进程执行结束之后,父进程如果不对其进行回收,子进程就会变为僵尸进程. 父进程可以通过调用wait()函数和waitpid()函数去回收子进程. 由于子进程结束时会发送SIGCHLD信号给父进程,不过 ...

  2. 009exec函数wait、waitpid回收子进程

    LINUX系统编程学习笔记 exec 子程序跳转,wait.waitpid 回收子程序 1. exec 函数族 1.1 exec 作用 1.2 exec 函数族头文件包含及声明 1.3 exec 函数 ...

  3. SIGCHLD信号回收子进程

    SIGCHLD信号回收子进程 代码 问题 注意点 代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h ...

  4. Linux进程3:父进程等待(wait,waitpid)子进程退出并收集子进程退出状态,僵尸进程

    父进程等待(wait,waitpid)子进程退出并收集子进程退出状态 1.父进程为什么要等待子进程退出? 创建子进程目的:------干活 我们要知道干活结束没. 子进程退出状态不被收集,变成僵尸进程 ...

  5. 父进程等待子进程结束

    from multiprocessing import Process import time # def task(name): # print("%s start" % nam ...

  6. java 事件cancel_Activiti结束事件(End Event)

    Activiti结束事件(End Event) 作者:Jesai -2017.08.03T01:03 曾经,黑夜多么漫长,八月雨扰眠,缘何? 声明:版权所有,如需引用请注明出处,如发现抄袭,必追究法律 ...

  7. 复习步骤12- 16 BPMN事件(3)结束事件

    结束事件: --按照事件的位置,开始事件一般都市捕获事件,结束时间一般都是抛出事件 无指定结束事件 -- 什么都没指定直接就结束掉了 错误结束事件   --  往往和错误边界事件或错误开始事件一起使用 ...

  8. 仿热血江湖帮战客方血帮战 开始对战记时器结束事件

    public void timer_1_Elapsed(object sender, ElapsedEventArgs e)         {             if (GClass4.int ...

  9. 仿热血江湖帮战客方血帮战 准备记时器结束事件

    public void timer_0_Elapsed(object sender, ElapsedEventArgs e)         {             if (GClass4.int ...

最新文章

  1. R语言计算平均值的标准误差(standard error of the mean):自定义函数计算平均值的标准误差、使用plotrix包的std.error函数计算平均值的标准误差
  2. Winform-DataGridView
  3. tos win10打开ip_win 10 系统 Docker 的安装和使用
  4. java进制原码_Java 一一 进制、原码 反码 补码、移位操作
  5. scala 主构造函数_Scala-构造函数
  6. struct1标签使用方法笔记
  7. 07 设置View的显示与隐藏
  8. 加速前进!华为已在全球多地注册“鸿蒙”商标
  9. excel怎么设置自动计算_Excel工作进度表,自动甘特进度图,函数计算简单实用...
  10. 下载并还原AdventureWorksDW2012数据库
  11. mysql identify_MySQL用户授权
  12. 初秋进补 粥汤大对决
  13. Java——批量更改图片像素(大小)
  14. c语言素数筛法与分解素因数,质因数分解及代码:
  15. 机器学习入门:准备知识笔记(seaborn及案例)
  16. 治愈系插画PSD源文件+笔刷分享
  17. [BUUCTF]PWN17——[HarekazeCTF2019]baby_rop
  18. 【干货】麦肯锡七步成诗解决问题方法最新原版课件.pdf(附下载链接)
  19. 10 | 生产者压缩算法面面观
  20. 英语期刊写作-通往国际学术舞台的阶梯第三章答案

热门文章

  1. 用数组建立二叉树(LeetCode二叉树测试)
  2. 最简单的基于FFmpeg的移动端例子:Android HelloWorld
  3. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器
  4. python画正方形并涂色_关于python使用cv画矩形并填充颜色同时填充文字
  5. linux下无对应分辨率,linux mint 向“显示(display)”面板添加没有提供的分辨率选项,使虚拟机中的linux mint可以全屏显示...
  6. python热力图美化_python如何画热力图?
  7. 【服务器】【个人网盘】宝塔搭建cloudreve
  8. NYOJ813 - 对决
  9. fj怎么样_评测:丰田FJ 酷路泽动力及性能怎么样是否值得入手
  10. uml边界类例子_面向对象UML笔记