父进程无法接收到子进程退出时发出的SIGCHLD信号

Gishell123 2007-07-02 06:18:12
相同的程序,在自己的SUSE/Red hat环境下都可以收到子进程退出时发出的SIGCHLD信号。
但是到客户(OS:SUSE)那边就是无法收到。
请问这个是什么原因造成的?是客户(OS:SUSE)的环境造成的吗?如果是怎么确认是环境问题?

谢谢。
...全文
818 13 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
描述清楚一点你的问题呀

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧