我知道有关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"; }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。