perl主进程如何等待多个子进程结束

perl主进程如何等待多个子进程结束,第1张

将“use POSIX ":sys_wait_h"”去掉,还有在主进程中打印子进程中的变量是不对的,主进程不知道子进程的状况,除非你用pipe将变量值传给主进程,

##################################################

#!/usr/bin/perl

#use POSIX ":sys_wait_h"

my $a=10

for($i=1$i<=3$i++){

my $pid=fork()

if (!defined($pid)) {

print "Error in fork: $!"

exit 1

}

if ($pid == 0 ) {

if($i==1){

sleep(9)

$b1=$a+1

print "$b1\t"

exit 0}

elsif($i==2){

sleep(5)

$b2=$a+10

print "$b2\t"

exit 0}

else{

sleep(3)

$b3=$a+100

print "$b3\t"

exit 0}

}

}

print "~~~~~~~~~~split~~~~~~~~~~~\n"

while (($collect = waitpid(-1, WNOHANG)) >0) {

1

}

##################### 输出 ##########

bsd2# perl test.pl

~~~~~~~~~~split~~~~~~~~~~~

110 20 11 bsd2#

给两个思路,第一个就是每个生成的子进程的pid都保存在主进程里面,例如保存在数组里。

然后,在load数据之前,用kill函数将0号信号发送给每个子进程。kill函数的0号信号不会发送真正的信号,只是测试能否向某个进程发送信号。这样,如果每个子进程都已经退出,那么对每个子进程进行kill 0都会得到假值,这样就可以load你的数据了。

第二个是思路是,设置一个全局变量,CHLD信号收割子进程时,每捕获一次便将全局变量加1。这时主进程就只要记录生成的子进程的个数,这样在load时判断全局变量与子进程的个数是否相等,若相等就代表子进程已经退出完毕了。当然,这种方法不会很保险,有可能两个或以上的子进程同时被收割,但全局变量只加了1,这样就会造成全局变量与子进程数永远都不相等而造成程序无限挂起……


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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存