mat*_*ull 4 perl fork ipc waitpid
我知道有关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()";
}
Run Code Online (Sandbox Code Playgroud)
编辑:
使用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";
}
Run Code Online (Sandbox Code Playgroud)
如果任务挂起,整个主循环挂起.绕过这个fork()和waitpid似乎是一个明显的选择.如果任务挂起,循环仍然挂起.
waitpid
与WNOHANG
选项一起使用.这样它就不会暂停父进程,并且会0
在子进程尚未退出时立即返回.在你的主循环中,你将不得不定期轮询所有的孩子(任务).
小智 5
您可能希望设置一个信号处理程序来处理来自 perlipc 的 SIGCHLD...,而不是定期对所有孩子进行轮询:
use POSIX ":sys_wait_h";
$SIG{CHLD} = sub {
while ((my $child = waitpid(-1, WNOHANG)) > 0) {
$Kid_Status{$child} = $?;
}
};
# do something that forks...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9144 次 |
最近记录: |