[英]Why doesn't waitpid wait for the process to exit?
在下面的腳本中,我試圖弄清楚waitpid
是如何工作的,但它不會等待ssh
進程退出。 done
打印,而不是在ssh
過程存在之后。
題
當我給它的pid退出時,如何才使waitpid
繼續?
#!/usr/bin/perl
use strict;
use warnings;
use Parallel::ForkManager;
use POSIX ":sys_wait_h";
my $pm = Parallel::ForkManager->new(5);
my $pid = $pm->start;
my $p = $pid;
if (!$pid) {
system("ssh 10.10.47.47 sleep 10");
$pm->finish;
}
$p = qx(/usr/bin/pgrep -P $p);
print "ssh pid is $p\n";
my $kid;
do {
$kid = waitpid($p, 0);
} while $kid > 0;
print "done\n";
我也試過了
while (1) {
$p = kill 0, $p;
print "x";
sleep 1 if $p;
print "*";
last unless $p;
}
但由於某種原因它甚至沒有達到第一次print
,也從未退出。
wait
函數系列僅適用於子進程,甚至是waitpid
。 睡眠過程不是你的孩子,而是你孩子的孩子。 這是因為system
本質上是fork
+ exec
。 通過使用Parallel :: ForkManager +系統,你正在分叉,然后再次分叉,然后執行睡眠。
既然你已經分叉了,你應該使用exec。 這有一個額外的好處,就是不需要調用pgrep和它的計時問題(即,在子進程執行系統之前,父進程可能會調用pgrep)。
my $pm = Parallel::ForkManager->new(5);
my $pid = $pm->start;
my $p = $pid;
if (!$pid) {
no warnings; # no warnings "exec" is not working
exec("sleep 10");
$pm->finish;
}
print "sleep pid is $p\n";
waitpid($p, 0);
為簡單起見,它現在正在使用睡眠。 必須抑制Perl警告“不可能達到聲明”,因為Perl沒有意識到$pm->start
已分叉。 這應該是no warnings "exec"
但這不起作用,所以我不得不壓制它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.