Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为Perl系统调用指定超时限制?_Perl_System - Fatal编程技术网

如何为Perl系统调用指定超时限制?

如何为Perl系统调用指定超时限制?,perl,system,Perl,System,有时,我的系统调用会进入一个永无止境的状态。为了避免,我希望能够在指定的时间后中断呼叫 有没有办法为指定超时限制 为了便于移植,我希望从Perl代码中实现超时,而不是使用某些特定于操作系统的函数,如ulimit。请参阅函数。pod中的示例: eval { local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required alarm $timeout; $nread = sysread SOCKET, $buffer,

有时,我的系统调用会进入一个永无止境的状态。为了避免,我希望能够在指定的时间后中断呼叫

有没有办法为指定超时限制

为了便于移植,我希望从Perl代码中实现超时,而不是使用某些特定于操作系统的函数,如ulimit。

请参阅函数。pod中的示例:

eval {
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
    alarm $timeout;
    $nread = sysread SOCKET, $buffer, $size;
    alarm 0;
};
if ($@) {
    die unless $@ eq "alarm\n";   # propagate unexpected errors
    # timed out
}
else {
    # didn't
}
CPAN上有一些模块将这些模块包装得更为美观,例如:

您可以使用的run方法而不是system。并设置一个超时。

怎么样

此模块扩展
系统
,以允许在指定秒后超时


我以前在Perl+Linux中使用过
timeout
命令,您可以这样测试:

for(0..4){
  my $command="sleep $_";  #your command
  print "$command, ";
  system("timeout 1.1s $command");  # kill after 1.1 seconds
  if   ($? == -1  ){ printf "failed to execute: $!" }
  elsif($?&127    ){ printf "died, signal %d, %scoredump", $?&127, $?&128?'':'no '}
  elsif($?>>8==124){ printf "timed out" }
  else             { printf "child finished, exit value %d", $? >> 8 }
  print "\n";
}
4.317秒后的输出:

sleep 0, child finished, exit value 0
sleep 1, child finished, exit value 0
sleep 2, timed out
sleep 3, timed out
sleep 4, timed out

timeout
命令是所有主要的“正常”Linux发行版a.f.a.i.k的一部分,coreutils的一部分。

这是一个重复的次数,我无法计数:仅为数不多。当内容移动或更改时,仅链接的答案没有帮助。在您的回答中包含链接的相关部分,并根据问题量身定制。始终欢迎指向潜在解决方案的链接,但请确保您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。考虑到仅仅是一个指向外部站点的链接是一个可能的原因。这似乎是可行的,但问题是通过系统调用执行的命令将继续运行,即使父Perl进程已经死亡。是否有人知道如何获取系统调用运行的进程的进程id/句柄,以便我们可以在Perl脚本结束之前杀死它?@antred-要获取进程id,则需要使用而不是。看看IPC::Cmd和IPC::Run之类的模块,让这更容易(在本文中)。我不知道为什么这个答案不高。在“运行系统调用时”的上下文中,使用系统解决方案似乎恰到好处,而且简单直接。非常适合“perl作为粘合代码”。谢谢下一次我编写perl应用程序时,IPC::Run将获得成功,但不管怎样,当我进行开发时,这是正确的。
timeout("3", "sleep 9"); # timeout exit after 3 seconds
for(0..4){
  my $command="sleep $_";  #your command
  print "$command, ";
  system("timeout 1.1s $command");  # kill after 1.1 seconds
  if   ($? == -1  ){ printf "failed to execute: $!" }
  elsif($?&127    ){ printf "died, signal %d, %scoredump", $?&127, $?&128?'':'no '}
  elsif($?>>8==124){ printf "timed out" }
  else             { printf "child finished, exit value %d", $? >> 8 }
  print "\n";
}
sleep 0, child finished, exit value 0
sleep 1, child finished, exit value 0
sleep 2, timed out
sleep 3, timed out
sleep 4, timed out