簡體   English   中英

為什么waitpid不等待進程退出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM