gpt4 book ai didi

perl - 杀死进程本身和所有子进程的最佳方法

转载 作者:行者123 更新时间:2023-12-02 04:22:35 26 4
gpt4 key购买 nike

我是新手。我的程序在生命周期内使用系统调用 fork() 创建一定数量的子进程。我需要处理父进程的中断信号,并在其处理程序中杀死程序运行时创建的所有子进程。
我尝试过以下代码...

setpgrp(0,0);
$SIG{INT} = \&kill_all;
sub kill_all() {
print "Going to kill child processes \n";
kill -9, getpgrp();
}
....
fork()..
....
fork()...
....
fork()
.....

但似乎并不是所有进程都被杀死,请建议正确的方法。

最佳答案

首先 - 不要 kill -9。除非绝对必要,否则这是不好的做法。 SIGTERM-15 更好。

要将内容发送到进程组,最简单的方法是(来自 perlipc: http://perldoc.perl.org/perlipc.html#Signals )

kill -$$

Sending a signal to a negative process ID means that you send the signal to the entire Unix process group.

或者 - fork 返回一个 pid。您可以显式地杀死该 pid。

如果您遇到 child 没有响应终止信号而退出的问题,那么最常见的问题是他们已经进入了不间断状态。

这可能类似于 NFS 安装上的 IO(或不可用的设备的其他 IO)。不幸的是,这是一个操作系统特定的问题,无法通过 perl 解决。您可以通过运行 ps -e v 并检查“state”标志来检查这一点。

state    The state is given by a sequence of characters, for example, "RWNA". The      first character indicates the run state of the process:
D Marks a process in disk (or other short term, uninterruptible) wait.
I Marks a process that is idle (sleeping for longer than about 20 seconds).
L Marks a process that is waiting to acquire a lock.
R Marks a runnable process.
S Marks a process that is sleeping for less than about 20 seconds.
T Marks a stopped process.
W Marks an idle interrupt thread.
Z Marks a dead process (a "zombie").

要么它们已经成为僵尸进程,并等待被收获。您可以通过设置 $SIG{'CHLD'} = "IGNORE"; 来避免这种情况但正如评论中所指出的 - 你不应该像通过 fork-pid 杀死一样这样做,因为它会产生竞争条件。

您还应该注意 - 如果您配置了一个信号处理程序,然后然后 fork,那么 fork 的子进程也具有该处理程序。您可能需要在子进程中再次删除它。

关于perl - 杀死进程本身和所有子进程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29260859/

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