linux – 为什么waitpid不等待进程退出?
发布时间:2020-12-13 16:58:55 所属栏目:Linux 来源:网络整理
导读:在下面的脚本中,我试图弄清楚waitpid是如何工作的,但它不会等待ssh进程退出.完成后立即打印,而不是在ssh过程存在之后. 题 当我给它的pid退出时,如何才使waitpid继续? #!/usr/bin/perluse strict;use warnings;use Parallel::ForkManager;use POSIX ":sys_wa
在下面的脚本中,我试图弄清楚waitpid是如何工作的,但它不会等待ssh进程退出.完成后立即打印,而不是在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 $pn"; my $kid; do { $kid = waitpid($p,0); } while $kid > 0; print "donen"; 我也试过了 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 $pn"; waitpid($p,0); 为简单起见,它现在正在使用睡眠.必须抑制Perl警告“不太可能达到声明”,因为Perl没有意识到$pm-> start已经分叉.这应该是没有警告“exec”,但这不起作用所以我不得不压制它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |