社区
Linux/Unix社区
帖子详情
父进程无法接收到子进程退出时发出的SIGCHLD信号
Gishell123
2007-07-02 06:18:12
相同的程序,在自己的SUSE/Red hat环境下都可以收到子进程退出时发出的SIGCHLD信号。
但是到客户(OS:SUSE)那边就是无法收到。
请问这个是什么原因造成的?是客户(OS:SUSE)的环境造成的吗?如果是怎么确认是环境问题?
谢谢。
...全文
898
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
信号
僵尸
进程
是
子
进程
退出
后,
父
进程
未回收的状态,内核保留其部分信息。
SIGCHLD
信号
在
子
进程
退出
时
发送给
父
进程
,通知其回收资源。避免僵尸
进程
的方法包括
父
进程
使用wait/waitpid等待或通过signal忽略
SIGCHLD
信号
,让内核自动处理。在并发服务器中,忽略
SIGCHLD
信号
可优化性能。
子
进程
结束向
父
进程
发送17号
信号
SIGCHLD
本文围绕Linux中
父
子
进程
展开,
子
进程
退出
会给
父
进程
发
SIGCHLD
信号
,默认被忽略。
父
进程
无需在main函数手动等待
子
进程
,可在自定义函数中处理。同
时
探讨了多个
子
进程
同
时
结束、某个
子
进程
永不
退出
的问题及优化方法,还提及不等待
子
进程
退出
的处理方式。
Linux
父
进程
未收到
子
进程
退出
信号
SIGCHLD
,而导致
子
进程
成为僵尸
进程
本文探讨了Linux系统中
父
进程
如何通过
SIGCHLD
信号
监测并回收
子
进程
,避免
子
进程
变成僵尸
进程
的问题。文章详细解释了
SIGCHLD
信号
的工作机制,以及为什么不当的waitpid函数使用会导致
子
进程
成为僵尸
进程
。提供了两种解决方案,一是非阻塞方式调用waitpid,二是主线程中持续检查并回收
子
进程
。
【linux学习指南】
SIGCHLD
信号
博客主要围绕
SIGCHLD
信号
展开,介绍了处理僵尸
进程
的方法。
子
进程
终止
时
会给
父
进程
发
信号
,
父
进程
可自定义
信号
处理函数清理
子
进程
。还提到通过将
SIGCHLD
处理动作置为忽略可避免产生僵尸
进程
,并给出了相关程序示例及代码分析。
Linux解决僵尸
进程
的几种方式,
SIGCHLD
信号
设置SIG_IGN处理方式等
文章讨论了Linux系统中僵尸
进程
的产生原因,即
父
进程
未处理
SIGCHLD
信号
或wait系列函数。提出了三种解决方案:
父
进程
阻塞调用wait(),非阻塞调用waitpid(),以及忽略
SIGCHLD
信号
。重点介绍了通过注册
SIGCHLD
信号
处理器结合waitpid()异步回收
子
进程
的方法,以避免僵尸
进程
和提高效率。
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章