问题标签 [sigchld]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 子进程会在 abort() 上发送 SIGCHLD 吗?
如果应用程序执行 afork()
并且子进程死于 a abort()
(由于失败 a assert()
),父进程会收到 aSIGCHLD
吗?
如果它是相关的,这是在 Debian 4(gcc 版本 4.1.2)上。
arrays - 在信号处理函数 (Perl) 中从 main:: 更新数组
我想维护一个我已经分叉的孩子的 pidlist 数组,然后在它们退出时将它们删除(以限制我在任何给定时间有多少个分叉进程)。我想我可能很聪明,可以通过在删除或拼接中使用@main::pid_list 来做到这一点,但没有乐趣。我可以成功弹出一个元素,但显然它不会删除正确的 pid。有什么想法如何处理这个问题,或者我会以完全不同的方式更好地做到这一点?
bash - bash 使用陷阱 SIGCHLD 重新启动子进程?
我已经看到监视程序在脚本中使用“ps”或“服务状态(在 Linux 上)”定期检查进程状态,或者在 C/C++ 中分叉并等待进程......
我想知道是否可以使用带有陷阱的bash并在收到SIGCLD时重新启动子进程?
我已经按照以下想法在 RedHat Linux 上测试了一个基本套件(当然它没有工作......)
正在启动的 bash 脚本只是休眠几秒钟然后退出。
观察到几个问题:
- 当 shell 在前台启动时,SIGCHLD 将只处理一次。陷阱复位信号处理是否像信号()?
- 脚本及其子进程似乎对 SIGINT 免疫,这意味着它们不能被 ^C 阻止
- 由于无法关闭,我关闭了终端。剧本似乎是HUP,留下了许多僵尸孩子。
- 在后台运行时,脚本导致终端死机
...无论如何,这根本不起作用。我不得不说我对这个话题知之甚少。有人可以建议或给出一些工作示例吗?有这种用途的脚本吗?
那么在 bash 中使用 wait 怎么样?
谢谢
perl - 为什么 Net::SNMP::Dispatcher 因“select() 错误 [无子进程]”而失败?
在轮询 SNMP 服务时,我需要一些帮助来识别和消除奇怪的子进程错误的原因。
在 SNMP 连接期间,我通过轮询设备名称来验证 SNMP 连接,直到超时:
大多数情况下,这可以完美运行,但在某些情况下,我会从 Net::SNMP::Dispatcher 中得到一个致命错误:
(第 857 行是snmp_dispatcher
上面的 get_bulk 中的)
我对 perl 很陌生——对 SNMP 完全陌生——我真的不知道如何解决这个问题。有问题的方法在 mod_perl CGI 调用中执行,如果这有助于隔离问题。
c - How can I handle SIGCHLD?
I need to handle SIGCHLD
properly. How can I use it with my existing code? at the moment I cant wait for the child process unless I use 0
instead of WNOHANG|WUNTRACED
.
If I remove sleep
then parent is executed 1st.. why?
c - SIGCHLD 处理 Beej 的指南示例
这是代码
我知道 SIGCHLD 是子进程终止时发送给进程的信号,但是子进程在哪里创建?!
linux - SIGCHLD 未在进程树中传递
我正在尝试创建一个进程来管理其他进程,如果孩子死了,那么父进程会重新启动进程和依赖于它的进程。
问题是我注意到如果我在这个结构中间重新启动一个进程时创建一个进程树结构,当新的子进程终止时我无法收到信号。
我写一个例子;假设我们有 3 个进程,祖父母,父母和孩子。祖父母分叉并启动父分叉并启动孩子(我将代码放在这篇文章的末尾)。现在,如果我杀死孩子一切正常,孩子就会正确重新启动。
如果我杀死父级,就会出现问题...重启子级的祖父级重新启动父级,但是如果我杀死子级,则进程保持在僵尸状态,并且 SIGCHLD 不会传递给父进程。
换句话说:
- 启动祖父进程并等待所有 3 个进程都已启动
- 杀死父进程并等待祖父母重新启动父进程,然后重新启动子进程
- 现在杀死子进程,进程保持在僵尸状态。
我无法理解这种行为......我已经阅读了大量关于信号和等待的示例和文档,尝试在父和祖父母的分叉之前重置默认处理程序,但似乎没有任何工作......这是代码示例...
祖父母.cpp
父级.cpp
孩子.cpp
c - 未收到使用 sudo 执行的进程的 SIGCHLD
我目前正在编写一个shell。我执行进程并SIGCHLD
在它们完成时使用信号处理程序来清理(等待它们)。
一切正常——除非我执行使用sudo
. 在这些情况下,我永远不会收到SIGCHLD
信号——所以我永远不知道进程已经完成执行。
当我收到诸如 之类的命令时sudo ls
,我执行程序sudo
,然后ls
作为参数提供。我用execvp
.
如果我ps -aux
在我的 shell 执行后查看一下sudo ls
,我会看到以下内容:
所以,sudo
跑了,被指派pid = 4795
了,孩子(ls)被指派了4796
。孩子已经完成了任务,现在正处于僵尸状态。sudo
似乎不想收获僵尸进程,只是坐在那里。
我想知道是什么导致了这种行为——我尝试了不同的技术来清理这些僵尸进程,例如在下面运行我的 shellsudo
并直接等待,然后sudo
执行(上面示例中的 4796)。这些技术都没有奏效。PID
sudo
与往常一样,我们将不胜感激任何建议。
perl - 各种 $SIG{CHLD} 值之间有什么区别?
这些设置有什么区别?
根据“UNIX 环境中的高级编程,第 2 版”,图 10.1 SIGCHLD 的默认值是“忽略”。
如果“忽略”意味着“SIG_IGN”,那么任何孩子都不会成为僵尸,而事实并非如此。
从那里并没有变得更清楚:
如果进程专门将其处置设置为 SIG_IGN,则调用进程的子进程将不会生成僵尸进程。请注意,这与其默认操作 (SIG_DFL) 不同,图 10.1 中的默认操作将被忽略。相反,在终止时,这些子进程的状态将被丢弃。
我很难理解各种值(或未定义的非值)的影响是什么。到目前为止,解决方案一直是在这些选择之间进行轮换,直到获得所需的行为,我宁愿准确了解每个值如何定义信号的行为。
行为:子进程正在调用“系统”或使用创建另一个子进程的反引号,并且信号通常会被错误的(父)处理程序捕获。设置本地处理程序可以工作,但如果我希望来自孙子的信号什么都不做,我不明白哪个值最合适。
有人可以照亮我吗?
更新: 根据 ikegami 的反馈,我做了一些具体的测试。该行为至少部分是特定于平台的。
考虑以下片段:
Solaris 10 上的 Perl 5.8.6 将为 system() 调用的 PID 显示“SIGNAL CHLD”消息。做任何事,哪怕是微不足道的事
本地 $SIG{CHLD};
在孩子会压制那些消息。
在我尝试过的所有其他口味中,收割者从未见过孩子。
wait - SIGCHLD 处理程序重新安装
我看到了一些 SIGCHLD 处理程序的示例,例如:
处理程序中有两个部分让我感到困惑:1)。SIGCHLD 在子进程终止或停止时被捕获。那么为什么需要在处理程序内部调用等待呢?信号已经到了。2)。为什么需要重新安装 SIGCHLD 处理程序。信号调用不是一劳永逸地安装处理程序吗?
谢谢!