perl的父子进程编程问题.

perl的父子进程编程问题.

最近在做一个功能需要用到perl的多进程.
简单描述:子进程如果在指定的时间内没有完成,有父进程强行终止。

code:
isOvertime() 是超时函数。

[Copy to clipboard] [ - ]
CODE:

use warnings;
use strict;

my($pid);
$| = 1;

if($pid=fork())
{
print("$pid \n");
sleep(1);

while(1)
{
  if (isOvertime())
  {
   kill('STOP',$pid);
   print("Sorry,you are overtime .\n");
   exit();
   }
  else                               #-----start-----
  {
   if(wait())                       
    {
    print("OK , now i can go .\n");
    exit();
    }                                 #-----end---
  }
}
}
elsif(defined($pid))
{
sleep(30);
print("i am ok! \n");
exit();
}
else
{
print("error \n");
}

本来是想,如果子进程能够在规定的时间内完成的话,父进程结束(不需要等到规定的时间在结束),但是问题是 父进程执行到wait()的时候就不循环了,一直在wait()直到子进程运行结束。。
wait    Behaves like the wait(2) system call on your system: it waits
               for a child process to terminate and returns the pid of the
               deceased process, or "-1" if there are no child processes.  The
               status is returned in $?.  Note that a return value of "-1"
               could mean that child processes are being automatically reaped,
               as described in perlipc.
那应该如何修改?
子进程里只有一个sleep(30),那肯定要等到timeout才能结束阿
问题解决了,不用wait()用waitpid()

[Copy to clipboard] [ - ]
CODE:
use warnings;
use strict;
use POSIX 'WNOHANG';

$SIG{ STOP } = \&stop;

my($pid);

$| = 1;

if($pid=fork())
{
        print("$pid \n");
        sleep(1);
       
        while(1)
        {
                if (isOvertime())
                {
                        kill('STOP',$pid);
                        print("Sorry,you are overtime .\n");
                        exit();
                        }
                else
                {
                        if(waitpid(-1,WNOHANG))
                  {
                         print("OK , now i can go .\n");
                         exit();
                  }
                }
        }
}
elsif(defined($pid))
{
        my $parent=getppid();
        print ("$parent \n");
        sleep(10);
        print("i am ok! \n");
        exit();
        }
else
{
        print("error \n");
        }

http://www.linux-cn.com/html/linux/system/20070505/27608_3.html 这个地址上有详细的wait()和waitpid()的说明。

结贴!