您可能會將父母及其子女放在自己的過程組中,並通過向父母發送信號來殺死整個家庭。
根據問題的性質,您可能願意將kill
帶走(McManus先生!),並且由於每個嘗試kill
的故障而生活在已經死亡的子進程上。
如果父進程除了跟蹤孩子什麼也不做,只需要一個簡單的waitpid
循環即可。
while ((my $kid = waitpid -1, 0) > 0) {
warn "$0: [$$] reaped $kid\n";
delete $kid{$kid};
}
如果你有在父進程等處理,在第二個參數WNOHANG
位設置爲waitpid
告訴系統調用不阻塞。這可以讓你定期收穫殭屍孩子,然後回到其他處理。
爲了演示的目的,假設我們啓動了一羣昏昏欲睡的孩子。
#! /usr/bin/env perl
use strict;
use warnings;
use 5.10.0; # for defined-or
my %kid;
for (1 .. 5) {
my $pid = fork // die "$0: fork: $!"; #/fix SO hilighting
if ($pid == 0) {
warn "$0: [$$] sleeping...\n";
sleep 10_000;
exit 0;
}
else {
$kid{$pid} = 1;
warn "$0: [$$] forked $pid\n";
}
}
然後從外部模擬殺敵,我們叉另一個孩子隨意摘掉它的兄弟姐妹的其餘部分。
my $pid = fork // die "$0: fork: $!";
if ($pid == 0) {
warn "$0: [$$] The killer awoke before dawn.\n";
while (keys %kid) {
my $pid = (keys %kid)[rand keys %kid];
warn "$0: [$$] killing $pid...\n";
kill TERM => $pid or warn "$0: [$$] kill $pid: $!";
delete $kid{$pid};
sleep 1;
}
exit 0;
}
現在從上面的循環讀取訃告。
while ((my $kid = waitpid -1, 0) > 0) {
warn "$0: [$$] reaped $kid\n";
delete $kid{$kid};
}
仔細檢查,沒有人活着出來。
if (keys %kid) {
my $es = keys %kid == 1 ? "" : "es";
die "$0: unkilled process$es:\n",
map " - $_\n", keys %kid;
}
輸出:
./waitpid-demo: [1948] forked 7976
./waitpid-demo: [7976] sleeping...
./waitpid-demo: [1948] forked 7244
./waitpid-demo: [7244] sleeping...
./waitpid-demo: [1948] forked 4776
./waitpid-demo: [4776] sleeping...
./waitpid-demo: [1948] forked 4304
./waitpid-demo: [4304] sleeping...
./waitpid-demo: [1948] forked 7908
./waitpid-demo: [7908] sleeping...
./waitpid-demo: [5144] The killer awoke before dawn.
./waitpid-demo: [5144] killing 7908...
./waitpid-demo: [1948] reaped 7908
./waitpid-demo: [5144] killing 7976...
./waitpid-demo: [1948] reaped 7976
./waitpid-demo: [5144] killing 4776...
./waitpid-demo: [1948] reaped 4776
./waitpid-demo: [5144] killing 4304...
./waitpid-demo: [1948] reaped 4304
./waitpid-demo: [5144] killing 7244...
./waitpid-demo: [1948] reaped 7244
./waitpid-demo: [1948] reaped 5144
不是祖父母,只是父母。在工作中會出現外部因素,有人可能會殺死其中一個子進程。這將發生意外或故意,我只是想確保我不會意外地殺死那些不是我的東西,如果pid被重用。我喜歡過程組是最好的選擇。 – stu
在這臺機器上還有其他真正(也是更重要)的東西在運行,意外殺死其中一個將是一件非常重要的事情。 – stu
@stu查看更新的答案。 –