2010-10-26 65 views
1

我正在尝试做一个基本的多处理任务,这就是我所拥有的。首先,我不知道将此程序作为非阻塞程序的正确方法,因为当我等待孩子的响应(使用waitpid)时,其他进程也必须在队列中等待,但,如果某些子进程在之前死亡(我的意思是进程死于无序)会发生什么?所以,我一直在寻找,我发现我可以得到刚刚死亡的进程的PID,因为我使用的是waitpid(-1, WNOHANG)。我总是得到一个警告,WNOHANG不是一个数字,但是当我添加lib sys_wait_h时,我没有得到那个错误,但脚本从未等待PID,可能是什么错误?在Perl中进行多处理任务时出现问题

 

#!/usr/bin/perl 
#use POSIX ":sys_wait_h"; #if I use this library, I dont get the error, but it wont wait for the return of the child 
use warnings; 

main(@ARGV); 

sub main{ 
my $num = 3; 
for(1..$num){ 
    my $pid = fork(); 
    if ($pid) { 
    print "Im going to wait (Im the parent); my child is: $pid\n"; 
    push(@childs, $pid); 
    } 
    elsif ($pid == 0) { 
    my $slp = 5 * $_; 
    print "$_ : Im going to execute my code (Im a child) and Im going to wait like $slp seconds\n"; 
    sleep $slp; 
    print "$_ : I finished my sleep\n"; 
    exit(0); 
    } 
    else { 
    die "couldn’t fork: $!\n"; 
    } 
} 

foreach (@childs) { 
    print "Im waiting for: $_\n"; 
    my $ret = waitpid(-1, WNOHANG); 
    #waitpid($_, 0); 
    print "Ive just finish waiting for: $_; the return: $ret \n"; 
} 
} 

在此先感谢,再见!

回答

3

如果您使用WNOHANG,如果没有孩子终止,进程不会阻塞。这是WNOHANG的重点;它确保waitpid()会很快返回。在你的情况下,它看起来像你想使用wait()而不是waitpid()。

+0

谢谢!我正在使用wait(),它的工作原理!谢谢! – pablomarti 2010-10-27 15:34:25

0

我发现POE对我来说很好地处理了所有这些东西。它是各种事物的异步(非阻塞)控制,包括外部过程。你不必处理所有低级别的东西,因为POE为你做。