gpt4 book ai didi

perl - 错误信息 "Signal SIGCHLD received, but no signal handler set."

转载 作者:行者123 更新时间:2023-12-04 13:37:58 31 4
gpt4 key购买 nike

我正在尝试调试一个复杂的 Perl 应用程序,该应用程序以错误消息“收到信号 SIGCHLD,但未设置信号处理程序”而终止。我知道它来自 Perl 解释器本身,特别是来自文件 mg.c它不能被捕获。但我不明白它的确切性质。

这是“不应该发生”的那种解释器的内部错误吗?

或者有没有(简单的)方法可以用最近的 Perl 版本重现这个错误?

我已经尝试使用 https://lists.gnu.org/archive/html/bug-parallel/2016-10/msg00000.html 中给出的提示重现它通过在无限循环中设置和取消设置信号处理程序,并从另一个脚本不断地在无限循环中触发该信号。但是我无法在 Perl 版本 5.18.4、5.26.0、5.26.2、5.28.2 和 5.30.2 中重现那里描述的行为。

我也找到了Signal SIGSTOP received, but no signal handler set in perl script有人分配到 $SIG{SIGSTOP}而不是 $SIG{STOP}但这也无助于使用简单的脚本重现问题。

我测试过的所有 perls 都是在没有线程支持的情况下构建的:

$ perl -Mthreads
This Perl not built to support threads
Compilation failed in require.
BEGIN failed--compilation aborted.

最佳答案

我在这里回答我自己的问题(据我目前所知):

通过插入这两行,错误消失了:

$SIG{CHLD} ||= 'DEFAULT';
$SIG{HUP} ||= 'DEFAULT';

我不会将此称为修复,而是一种解决方法,因为“DEFAULT”的值应触发与无值响应完全相同的行为。 undef .

错误信息是 Perl 的内部错误。解释器在这里提供保护以防止 Perl 中的信号处理错误。

话虽如此,也没有重现错误的简单示例。如果有的话,那将是 Perl 中的一个错误。

前段时间为 GNU 并行报告了类似的错误: https://lists.gnu.org/archive/html/bug-parallel/2016-10/msg00000.html

那里报告的错误与我遇到的错误有一些共同点,特别是它发生在 fork() 之后。 ing。

我的应用是基于 Net::Server的服务器,并且在请求处理程序生成子进程时发生错误。有趣的是,错误消息(和退出)发生在子进程终止之前。

子进程可能会运行很长时间。因此,它被设为 setsid() 的 session 领导者。 ,所有打开的文件描述符都被关闭,标准输入被重定向到 /dev/null , 之前 exec()正在被调用。换句话说,它是一种守护进程。

还应该注意的是,当对代码进行小的修改时,错误就会消失,例如转储 %SIG 的内容。用于调试目的。

在 Perl 版本 5.8.9、5.14.4 和 5.16.3 中也没有发生该错误。在 5.18.4、5.26.2 和 5.30.2 中,它始终可以重现。所有这些可执行文件都是在没有解释器线程支持的情况下构建的。

关于perl - 错误信息 "Signal SIGCHLD received, but no signal handler set.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60708194/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com