gpt4 book ai didi

perl - 有没有办法只阻止特定的 child 触发 SIGCHLD?

转载 作者:行者123 更新时间:2023-12-04 20:43:25 25 4
gpt4 key购买 nike

我正在写一个 debugging utility , 我要 fork一个 child ,同时防止该 child 的终止触发 SIGCHLD给它的 parent 。我还是希望其他 child 正常引起SIGCHLD终止时。

我想这样做是因为我不想要 fork触发现有 $SIG{CHLD}处理程序,但我仍然希望其他 child 触发它。也就是说,我想隔离我的新 child ,我不希望它干扰现有 child 的管理。

我很担心在本地安装自定义 $SIG{CHLD}处理程序,因为我认为我无法正确检测何时应该调用原始处理程序。例如,如果我安装本地 $SIG{CHLD}处理程序,那么我保证会收到 SIGCHLD一旦我产生了一个 child 并拥有父级时发出信号 waitpid让它终止。然而,那个SIGCHLD不会指示其他 child 是否也已终止,因此我无法确定是否调用原始处理程序。

我研究过一个进程不能改变它的父 pid。我不确定更改 child 的进程组 ID 或 session ID 是否有用。

甚至可以防止特定的 child 触发SIGCHLD在 parent 身上?我是否被迫依赖现有的$SIG{CHLD}处理程序在收到 SIGCHLD 时执行正确的事情一个 child 没有预料到的信号?

尽管可能有更好的方法来实现该调试实用程序(如果有,请告诉我),但我仍然想知道 POSIX 是否提供了对子项的这种细粒度控制,并且正在寻找 Perl 解决方案来解决我的困境。

最佳答案

您无法轻松阻止 SIGCHLD完全,但如果信号处理程序编写正确,您可以通过孤立它来防止 waitpid 返回您的调试工具的 pid。

use Signal::Mask;
sub start_background_child {
local $Signal::Mask{CHLD} = 1;
my $first = fork;
croak "fork failed: $!" if not defined $first;
if ($first) {
waitpid $first, 0;
return;
}

my $second = fork;
croak "fork failed: $!" if not defined $second;
exit if $second;

your_stuff_here();
}

关于perl - 有没有办法只阻止特定的 child 触发 SIGCHLD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22201502/

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