问题标签 [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.
linux - 如何在使用 GNU Parallel 的 Bash 脚本中避免 SIGCHLD 错误
我正在循环运行 script.sh。该脚本包含一个并行的 wget 命令。我收到以下错误:
循环如下所示:
导致错误的行如下所示(省略选项和设置):
研究:
我不是 GNU Parallel 的专家,但脚本似乎在大多数情况下都可以正常工作,除非我收到上述错误。在查找 SIGCHLD 时,我了解到并行运行会创建“僵尸进程”,有时,我们需要“收获”这些进程。另外,我发现您可以杀死进程,因为有时它们可以占用所有可用的连接。
试图理解:
但是,我首先不知道是什么导致了这个问题。是我的相似之处吗?我不是在“收获”过程吗?我应该明确地杀死进程吗?是因为我在循环中运行并行脚本吗?
我的问题:
如何解决 SIGCHLD 错误?
如果您对此有任何经验,我们将不胜感激您的洞察力。
python-2.7 - 为什么由于分段错误而杀死的子进程不会立即死亡?
我需要编写一个接受某个输入并打印相应输出的 C++ 代码。此代码旨在使用 Python 子流程模块运行。无论输入和输出如何,我都需要确保 Python 代码不会由于 C++ 代码遇到的运行时错误而过早终止。C++代码的基本性质如下
运行它的 Python 代码如下:
这就是问题所在。尽管 C++ 代码遇到分段错误,但会调用信号处理程序并RuntimeError
引发 ,但 Popen 对象的返回码是none
,表明进程仍然存在。
现在,如果对 except 块进行以下更改:
问题已解决。输出显示 Popen 对象的返回码为 -11 并且“发生分段错误”打印到屏幕上。
如果我尝试模拟由于被零除而导致的浮点异常,也会发生完全相同的情况。
为什么会这样?
linux - 在运行时更改子进程的终止信号
使用clone()
fork 进程,您可以指定子进程在死亡时应发送其父进程而不是“正常”的信号SIGCHLD
。
创建孩子后是否可以更改设置的终止信号?是孩子还是家长?
linux - Linux:如何编程来监控进程存在/退出?
SIGCHLD 只能被父进程捕获以监控子进程是否退出。但是我想写一个独立的程序来监控一些进程,如果它们退出,立即报告日志。
有没有我可以使用的编程方式,而不是使用 shell“ps”命令来监视进程名称/id,然后在死循环中查询?
c - 后台进程的信号处理
我正在尝试在 C 中实现一个简单的 Unix shell。但是,我无法通过使用 sigaction 来实现后台进程功能。我的代码结构如下:
此外,在我的 execCommand 函数中,结构如下:
我的处理程序如下所示:
但是这种结构损害了我的整个实现。甚至前台进程也无法正常工作。当我执行前台命令时,它给出:
当我执行后台命令时,它给出:
那么,我该如何解决这个问题呢?
提前致谢...
编辑:当我用 valgrind 调试我的代码时,它给出了以下内容:
sigchld - 不能忽略信号 CHLD,强制默认
我希望有一个孤立的子进程,它将在后台运行一个 perl 脚本,并且我希望父进程在不等待其子进程的情况下完成。因此,我在开始时使用了 signal(SIGCHLD,SIG_IGN) 来忽略完成时的子信号并避免僵尸。但是当我运行代码时,它给我的错误是不能忽略信号 CHLD,强制默认。. 另一方面,当我运行那些注释行而不是运行所需的信号时。这是什么原因?
c - 无法获取 sigchld_handler 中的 pid 的 getpgid()
在我正在开发的 shell 中,我A | B | C
通过派生子来执行管道中的每个子来执行一组命令。这 3 个孩子的 PGID 都与第一个孩子的 PGID 相同。即 PID x, y, z 的 3 个孩子的 PGID = x。所有 3 个命令的执行运行完美。在 SIGCHLD 信号处理程序sigchld_handler()
中,我等待计算终止的子项数量,一旦为 3,我获取 PGID 以获取要从JobList
. 但是,该函数getpgid()
返回-1
所有 3 个 PID x, y, z
。即getpgid(x), getpgid(y), getpgid(z)
全部返回-1
errno 3 (ESRCH)。
在将 pgid 设置为setpgid()
在父进程中使用的子进程时,getpgid()
工作得非常好并返回 x。此问题仅发生在信号处理程序中。你能指导我在信号处理程序中获取pgid
吗pid
?
这是信号处理程序代码:
而在main()
,在父进程中,在我这样做之后:
任何帮助是极大的赞赏。
谢谢。
c - SIGCHLD 信号的处理程序
代码不起作用,它进入循环。我认为错误出在 gestore 方法中,它是 SIGCHLD 信号的处理程序。这是我第一次使用处理程序来捕获 SIGCHLD 信号。这个程序继续从 0 到 argv[1] 随便提取,直到一个数字出现 argv[1] 次。如果不清楚,您可以测试我放在问题末尾的旧程序。你能帮我找出错误吗?
我的目标是修改我的旧程序(有效),改变我捕获孩子退出状态的方式。从与“等待”同步到与处理 SIGCHLD 信号的 gestore 方法异步。这是我的旧程序:
//掷骰子.c
c - UNIX 信号处理。在 SIGCHLD 处理程序中等待。C
我有一个父进程和一个子进程。在父级中,我为 SIGCHLD 建立了一个信号处理程序。我向孩子发送 SIGTSTP 信号,触发 SIGCHLD 并在父母的 SIGCHLD siganl 处理程序中调用等待函数来获取停止的孩子的状态。但不是立即返回,而是阻塞。然后我向孩子发送一个 SIGCONT 信号并等待返回,并将 errno 设置为 Interuppted 系统调用。我无法理解我错过了什么。
c - 在 popen 函数调用后睡眠在子进程中不起作用
我编写了一个小的 C 程序,它创建一个子进程,然后使用 popen 运行一个 shell 命令。我创建了一个信号处理程序来等待子进程结束,而父进程只是在无限循环中运行。当我在 popen 系统调用之后调用“sleep(5)”时,睡眠调用不起作用。
相反,如果我将 sleep 调用放在 popen 之前,那么它正在工作。此外,如果我删除信号处理程序并在父进程中等待子进程,那么就没有问题(即睡眠在任何地方都可以正常运行)。
当我运行上述程序时,sleep #1 工作并且进程在给定的时间内睡眠。我通过观察打印命令结果(通过 printf 语句)所需的时间来了解这一点。但是对于睡眠#2 和睡眠#3,我希望进程进入睡眠状态,但这似乎并没有发生,因为命令的结果会立即打印在控制台上。
可以通过仅保留 sleep #2 或 sleep #3 调用并删除其他两个 sleep 调用来观察该行为。
有谁知道为什么会这样?