##################################################
#!/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,这样就会造成全局变量与子进程数永远都不相等而造成程序无限挂起……
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)