我知道有很多关于waitpid和超时的问题,但它们都是通过在警报处理程序中杀死子进程来解决的。
这不是我想要的,我想让进程保持运行但从waitpid中分派它。
我试图解决的潜在问题是一个带有主循环的守护进程,该进程处理队列。任务一个接一个地进行处理。
如果任务挂起,则整个主循环将挂起。为了解决这个问题,fork()和waitpid似乎是一个明显的选择。但是,如果任务挂起,则循环也会挂起。
我可以想到一些解决方法,其中我根本不使用waitpid,但我必须以另一种方式跟踪正在运行的进程,因为我仍然希望在可能挂起的任务并行处理一个任务。
我甚至可以杀死任务,但我想让它运行以检查出错的具体原因。还可以使用转储一些调试信息的kill处理程序。
总之,解决这个问题最方便的方法是在可能的情况下设置waitpid的超时。
编辑:
这是我使用fork()和waitpid的方式,可能更清楚地说明了子进程的含义。
这不是我想要的,我想让进程保持运行但从waitpid中分派它。
我试图解决的潜在问题是一个带有主循环的守护进程,该进程处理队列。任务一个接一个地进行处理。
如果任务挂起,则整个主循环将挂起。为了解决这个问题,fork()和waitpid似乎是一个明显的选择。但是,如果任务挂起,则循环也会挂起。
我可以想到一些解决方法,其中我根本不使用waitpid,但我必须以另一种方式跟踪正在运行的进程,因为我仍然希望在可能挂起的任务并行处理一个任务。
我甚至可以杀死任务,但我想让它运行以检查出错的具体原因。还可以使用转储一些调试信息的kill处理程序。
总之,解决这个问题最方便的方法是在可能的情况下设置waitpid的超时。
编辑:
这是我使用fork()和waitpid的方式,可能更清楚地说明了子进程的含义。
my $pid = fork();
if ($pid == 0){
# i am the child and i dont want to die
}
elsif ($pid > 0) {
waitpid $pid, 0;
# i am the parent and i dont want to wait longer than $timeout
# for the child to exit
}
else {
die "Could not fork()";
}
编辑:
使用 waitpid WNOHANG 可以实现我的目的。这种用法是否是良好的实践,还是你会采用其他做法?
use strict;
use warnings;
use 5.012;
use POSIX ':sys_wait_h';
my $pid = fork();
if ($pid == 0){
say "child will sleep";
sleep 20;
say "child slept";
}
else {
my $time = 10;
my $status;
do {
sleep 1;
$status = waitpid -1, WNOHANG;
$time--;
} while ($time && not $status );
say "bye";
}