社区
Linux/Unix社区
帖子详情
父进程无法接收到子进程退出时发出的SIGCHLD信号
Gishell123
2007-07-02 06:18:12
相同的程序,在自己的SUSE/Red hat环境下都可以收到子进程退出时发出的SIGCHLD信号。
但是到客户(OS:SUSE)那边就是无法收到。
请问这个是什么原因造成的?是客户(OS:SUSE)的环境造成的吗?如果是怎么确认是环境问题?
谢谢。
...全文
818
13
打赏
收藏
父进程无法接收到子进程退出时发出的SIGCHLD信号
相同的程序,在自己的SUSE/Red hat环境下都可以收到子进程退出时发出的SIGCHLD信号。 但是到客户(OS:SUSE)那边就是无法收到。 请问这个是什么原因造成的?是客户(OS:SUSE)的环境造成的吗?如果是怎么确认是环境问题? 谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Gishell123
2007-07-29
打赏
举报
回复
A里面没有屏蔽SIGCHLD,A会接收它的子进程的SIGCHLD,并做一些事后处理。
NC
2007-07-09
打赏
举报
回复
由于环境是在客户那边,所与无法调试。
大概是这样的:
父进程A fork B。(A还可以fork 其他子进程)
B fork C。
如果按照这个流程,B无法收到C退出后发出的SIGCHLD,
但是如果用script启动B,那么被B fork 出的C退出后,可以收到C发出的SIGCHLD。
这个现象大概是什么原因造成的呢?
==============================================================
会不会是你在A里面屏蔽了SIGCHLD?
dai_weitao
2007-07-09
打赏
举报
回复
你的父进程A是怎么处理SIGCHLD信号的
Gishell123
2007-07-08
打赏
举报
回复
顶一下。
Gishell123
2007-07-04
打赏
举报
回复
To Ropyn(剑心):
确认定了_XOPEN_SOURCE,但是现在还不确认是否第一个子进程的SIGCHLD能够接收到。
请看楼上的流程,A是从shell直接启动的。如果B也是从shell通过脚本启动,那么可以收到C的SIGCHLD。
Gishell123
2007-07-04
打赏
举报
回复
由于环境是在客户那边,所与无法调试。
大概是这样的:
父进程A fork B。(A还可以fork 其他子进程)
B fork C。
如果按照这个流程,B无法收到C退出后发出的SIGCHLD,
但是如果用script启动B,那么被B fork 出的C退出后,可以收到C发出的SIGCHLD。
这个现象大概是什么原因造成的呢?
DanXer
2007-07-03
打赏
举报
回复
4,5楼瞎说,不是这个原因.
SA_NOCLDSTOP是说子进程在STOP状态时(收到SIGSTOP,SIGTTIN,SIGTTOUT)不发送SIGCHLD给父,但是当中止时(SIGKILL,SIGTERM)还是会发SIGCHLD给父进程。
考虑看编译时是否定义了_XOPEN_SOURCE,而且父进程是否有多个子进程,在第一个子中止后,第二个子的SIGCHLD就收不到了。
OstrichFly
2007-07-03
打赏
举报
回复
是啊,自己屏蔽掉了,LZ解释一下为什么要这样?
plusboy
2007-07-03
打赏
举报
回复
利用wait看看能得到什么
dai_weitao
2007-07-02
打赏
举报
回复
你搞什么, 先用NOCLDSTOP把SIGCHLD屏蔽, 再调用, 还问为什么父进程收不到CHLD, 捣乱啊你?
Gishell123
2007-07-02
打赏
举报
回复
int sig = SIGCHLD;
struct sigaction act;
struct sigaction oact;
::sigemptyset ( &act.sa_mask );
act.sa_flags = 0;
if ( sig == SIGCHLD )
act.sa_flags |= SA_NOCLDSTOP;
int ret = ::sigaction ( sig, &act, &oact );
NC
2007-07-02
打赏
举报
回复
把你的程序贴出来看看。
cceczjxy
2007-07-02
打赏
举报
回复
描述清楚一点你的问题呀
Linux
父
进程
未收到
子
进程
退出
信号
SIGCHLD
,而导致
子
进程
成为僵尸
进程
在linux系统中,
父
进程
通常会
接收
子
进程
SIGCHLD
信号
监测
子
进程
是否
退出
,通过waitpid函数对
子
进程
进行回收。但是实际应用过程中waitpid使用不当,会出现
子
进程
成为僵尸
进程
。原因在于,
SIGCHLD
信号
是不可靠
信号
,不可靠
信号
在Linux中不进行排队,只是放到一个缓冲区,一旦该
信号
解除阻塞则会立即被发送一次(不可靠
信号
会丢失)。 任何一个
子
进程
(init除外)在exit()之后,并非马上就消失,而是留下一个称为僵尸
进程
(Zombie)的数据结构,等待
父
进程
回收。由于
SIGCHLD
信号
的丢失,如
php
子
进程
信号
,swoole process
子
进程
fatal,
父
进程
监听不到
SIGCHLD
信号
?
cli模式下用process多
进程
。master
进程
通过
SIGCHLD
监听
子
进程
退出
并重启
子
进程
。swoole_process::signal(
SIGCHLD
,function(){//
子
进程
退出
while($ret=swoole_process::wait(false)){unset(self::$wokers[$ret['pid']]);...
SIGCHLD
信号
(1)
SIGCHLD
信号
产生的条件 1.
子
进程
终止
时
会向
父
进程
发送
SIGCHLD
信号
,告知
父
进程
回收自己,但该
信号
的默认处理动作为忽略,因此
父
进程
仍然不会去回收
子
进程
,需要捕捉处理实现
子
进程
的回收; 2.
子
进程
接收
到SIGSTOP(19)
信号
停止
时
; 3.
子
进程
处在停止态,接受到SIGCONT后唤醒
时
。 综上:
子
进程
结束、
接收
到SIGSTOP停止(挂起)和
接收
到SIGCONT唤醒
时
都会向
父
...
进程
(六)
一.
SIGCHLD
(1)当
子
进程
退出
的
时
候,内核会向
父
进程
发送
SIGCHLD
信号
,
子
进程
的
退出
是个异步事件(
子
进程
可以在
父
进程
运行的任何
时
刻终止) (2)
子
进程
退出
时
,内核将
子
进程
置为僵尸状态,这个
进程
称为僵尸
进程
,它只保留最小的一些内核数据结构,以便
父
进程
查询
子
进程
的
退出
状态。 (3)
父
进程
查询
子
进程
的
退出
状态可以用wait/waitpid函数 二.wait (1)头文件<sy...
linux_
SIGCHLD
信号
-
子
进程
回收
-1 回收指定
进程
组内的任意
子
进程
可以和kill命令一起使用,例如:kill -9 -
进程
组ID。printf(“
子
进程
%d
退出
%d\n”, pid, WEXITSTATUS(status));printf(“
子
进程
%d 取消
信号
%d\n”, pid, WTERMSIG(status));0 回收指定ID的
子
进程
,回收指定
子
进程
时
,只要该
子
进程
结束,就可回收,回收
时
间>=
子
进程
结束
时
间。1.
子
进程
继承了
父
进程
的
信号
屏蔽字和
信号
处理动作,但
子
进程
没有继承未决
信号
集spending。
Linux/Unix社区
23,120
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章