问题标签 [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.

0 投票
1 回答
363 浏览

c - 未收割的孩子和他的未来

因此,当孩子去世时,父母会得到SIGCHLD,但如果父母在执行 wait() 之前死亡,则孩子会重新成为init. 此时的孩子是zombieie <defunct>

接下来发生什么?

init对那个孩子做 wait() 吗?如果是,它什么时候做?关于时限的任何保证?

0 投票
2 回答
2278 浏览

c - Windows 的 SIGCHLD 替换

我想在 Windows 上具有 SIGCHLD 功能(即,当孩子死亡时通知父进程)。我知道 Windows API 中没有与 SIGCHLD 等效的东西,但我想知道用 Windows 实现它的常用方法是什么。我确信这是 Windows 开发人员经常遇到的问题。

我现在能想到的唯一解决方案是轮询孩子们,看看他们是否还活着。

注意:我的应用程序是单线程的,如果可能的话,我希望保持这种状态。该应用程序有一个非阻塞事件循环(使用 select())。

0 投票
1 回答
2250 浏览

bash - 捕获 CHLD 信号 - ZSH 有效,但 ksh/bash/sh 无效?

这是一个示例代码,其中一个 shell 脚本在后台启动一些作业,并且在接收到 CHLD 信号(即子进程终止)后,它将采取一些措施......问题是,如果父 shell 脚本是 ZSH 脚本,它可以正常工作并捕获 CHLD 信号,但其他 shell不能!这是为什么?

0 投票
2 回答
23057 浏览

c - SIGCHLD 信号处理

在 Unix 中,当后台的子进程终止时,它会向SIGCHLD父进程发送一个信号,通知它它已终止。

即使进程在前台也会发生同样的情况吗?如果是这样,这意味着父母将忽略它。

这是正确的吗?或者如果它在前台,那么根本没有信号发送?

0 投票
2 回答
2766 浏览

linux - 父进程中的 execl()-ing: SIGCHLD 被 ps 捕获

我正在对 fork()、exec() 和相关的 UNIX 调用进行分配,我需要在其中显示(子)进程的僵尸状态。这是相关的代码:

我期望的是:

我得到的是:

但是,当sleep(int time)在调用之前插入(以秒为单位的整数时间)时execl,我得到了所需的输出并且没有报告任何信号错误。

这里发生了什么事?是否ps成为(尚未成为僵尸的)孩子的新父母?为什么ps命令不执行?这会sleep()根据ps需要执行什么操作?

我是 POSIX/Linux 编程的新手,因此SIGCHLD我将不胜感激此信号与我的特定情况的任何相关性。谢谢!

0 投票
1 回答
564 浏览

perl - perl,没有“打开”的子进程

嗨我有这个问题,perl脚本吐回“没有找到子进程”......

我的脚本调用了几种不同类型的 fork,所以我尝试实现 perldoc 的 waitpid() 实现方法,以便能够同时处理 fork & exec & system & qw。

这部分代码执行没有问题,但是当我尝试关闭文件句柄的 CLOSE 时出现“未找到子处理器”。有人可以向我解释这是怎么发生的,因为我真的想更深入地了解这个问题。我最终是否会收获由 OPEN 调用分叉的子进程,以便关闭不知道如何处理文件句柄?或者我可以 100% 折扣。任何解决方案将不胜感激

0 投票
4 回答
4167 浏览

bash - 当特定子进程终止时,如何在 bash 脚本中接收通知?

我想知道是否有人可以帮助解决这个问题?

我有一个 bash 脚本。它启动一个子进程,这是另一个基于 gui 的应用程序。然后 bash 脚本进入交互模式,从用户那里获取输入。这种交互模式无限期地继续下去。我希望它在子进程中的 gui 应用程序退出时终止。

我看过 SIGCHLD 但这似乎不是答案。这是我尝试过的,但是当 prog 结束时我没有收到信号。

更新了以下答案。我现在使用“nosid”的建议进行这项工作。我现在有另一个相关的问题,即接下来的交互过程是一个基本的菜单驱动过程,它阻止等待用户的键输入。如果子进程结束 USR1 信号直到收到输入后才被处理。有没有办法强制立即处理信号?

等待看起来像这样:

更新了解决方案。我已经解决了这个问题。诀窍是使用非阻塞 I/O 进行读取。现在,有了“nosid”的答案和我的修改,我得到了我想要的。为了完整起见,这对我有用:

0 投票
2 回答
1086 浏览

c - 通过 SIGCHLD 休眠

我有一个 C 程序,它每分钟轮询一次硬件传感器,并将读数添加到数据库中。为了确保读数接近于每分钟(而不是每分钟 + 开销时间),程序会创建一个孩子来完成实际工作,然后在创建另一个孩子之前休眠 60 秒。

我遇到的麻烦是孩子们的 SIGCHLD 正在中断睡眠(60),导致创建无限的孩子​​,而不是每分钟一个。

这就是我一直在尝试的方式:

我还听说 select() 可用于通过执行以下操作来实现我所追求的目标:

但由于某种原因,这只适用于 while 循环中的 1 次迭代。之后,该程序根本不等待,并不断创建孩子。

那么我怎样才能最好地让我的程序做到这一点而不会被 sigchld 打断呢?

0 投票
1 回答
3499 浏览

c - c 中的 SIGCHLD 处理程序 - 不需要的等待

我对 SIGCHLD 处理程序函数有以下问题。

处理程序代码非常简单:

当我只分叉一个孩子时,这很有效。如果我有 2 个孩子(或更多)并且其中一个已经完成运行,则 sigchld_handler() 将启动,当它到达“end = wait(NULL)”行时,程序会一直等到我拥有的另一个孩子完成。

有没有办法获得刚刚以不同方式结束的孩子的 PID 并避免这种等待?

0 投票
1 回答
1065 浏览

c++ - mount() 和 jffs2_gcd_mtd0 垃圾收集器

我正在运行MontaVista Linux 3.1 的平台上工作。

我有一个 C++ 应用程序,由于我不会深入探讨的深奥原因,它必须在只读和读写之间定期重新安装 JFFS2 闪存文件系统。

当您执行在int mount(...)中指定的调用sys/mount.h以将文件系统设置为读写时,jffs2_gcd_mtd0垃圾收集器进程将按预期启动。但是,当您重复mount调用以返回只读时,jffs2_gcd_mtd0会被杀死,并成为一个已失效的进程。

几分钟后,我们最终得到了大量已失效的jffs2_gcd_mtd0进程,无论我们做什么,都无法摆脱它们。

我可以使用以下测试应用程序复制问题:

我尝试了各种方法来获取已失效的进程:设置signal(SIGCHLD, SIG_IGN)(不起作用);wait(int)在设置为只读后调用(失败,errno 变为 10 - “无子进程”);打电话kill(0, SIGCHLD)(不起作用)。

我是否正确假设这是mount我们所拥有的实现中的一个错误?鉴于这是一个错误,我该如何删除已失效的进程,并阻止进程 ID 表填满?


一些补充信息:当我使用strace. 现在我真的被难住了!