我知道關於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()";
}
編輯:
使用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";
}