linux – 为什么waitpid不等待进程退出?

linux – 为什么waitpid不等待进程退出?,第1张

概述在下面的脚本中,我试图弄清楚waitpid是如何工作的,但它不会等待ssh进程退出.完成后立即打印,而不是在ssh过程存在之后. 题 当我给它的pid退出时,如何才使waitpid继续? #!/usr/bin/perluse strict;use warnings;use Parallel::ForkManager;use POSIX ":sys_wait_h";my $pm = Pa 在下面的脚本中,我试图弄清楚waitpID是如何工作的,但它不会等待ssh进程退出.完成后立即打印,而不是在ssh过程存在之后.

当我给它的pID退出时,如何才使waitpID继续?

#!/usr/bin/perluse 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;}

但由于某种原因它甚至没有达到第一次印刷,也从未退出.

解决方法 等待函数系列仅适用于子进程,甚至是waitpID.睡眠过程不是你的孩子,而是你孩子的孩子.这是因为系统本质上是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已经分叉.这应该是没有警告“exec”,但这不起作用所以我不得不压制它们.

总结

以上是内存溢出为你收集整理的linux – 为什么waitpid不等待进程退出?全部内容,希望文章能够帮你解决linux – 为什么waitpid不等待进程退出?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1039859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存