加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 如何在不杀死孩子的情况下超时waitpid?

发布时间:2020-12-15 23:25:17 所属栏目:大数据 来源:网络整理
导读:我知道有关waitpid和超时的许多问题,但他们都通过在警报处理程序中杀死孩子来解决这个问题. 这不是我想要的,我想保持进程运行但是从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";
}

解决方法

If a task hangs the whole main loop hangs. To get around this fork()
and waitpid seemed an obvious choice. Still if a task hangs the loop
hangs.

使用带有WNOHANG选项的waitpid.这样,它不会暂停父进程,并且在子进程尚未退出时立即返回0.在你的主循环中,你将不得不定期轮询所有的孩子(任务).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读