java父进程获取子进程异常_如何在perl的父进程中获取死亡的子进程的PID?
您可以將父項及其子項放在自己的進程組中,并通過向父項發送信號來終止整個系列 .
根據您的問題的性質,您可能愿意離開(麥克馬納斯先生!),并且因為每次嘗試 kill 對已經死亡的子進程感到失敗 .
如果父進程除了跟蹤孩子之外什么都不做,那么您只需要一個簡單的循環 .
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;
}
現在,上面的循環讀取了ob告 .
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
總結
以上是生活随笔為你收集整理的java父进程获取子进程异常_如何在perl的父进程中获取死亡的子进程的PID?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java自定义异常返回_Java自定义异
- 下一篇: Java jdt 编辑_JDT入门