perl实现超时机制综述

perl实现超时机制综述,第1张

概述一、ALARM方式 示例程序: #!/usr/bin/perl $timeout = 2 ; while(1) {    eval {     local $SIG{ALRM} = sub{print "sorry,time out.please try again\n"} ;     alarm $timeout ; #启动定时器     # 实际 *** 作     print "hello worl 一、ALARM方式
示例程序:
#!/usr/bin/perl

$timeout = 2 ;
while(1)
{
   eval {
    local $SIG{ALRM} = sub{print "sorry,time out.please try again\n"} ;
    alarm $timeout ; #启动定时器
    # 实际 *** 作
    print "Hello World!\n" ; 
    sleep 3 ;
 alarm 0 ;        #取消定时器
  } ;
  dIE $@ if $@ ;
}
说明:
将实际 *** 作放在eval块中。
首先,初始化一个本地化的ALRM信号处理器,它位于特殊的%sIG哈希里。
假如触发了该处理器,它会调用dIE()并且中断eval块。然后可以根据$SIG{ALRM}信号处理程序来做相应的处理。
大多数情况下,你可能需要向用户报告, *** 作已超时
实际的 *** 作放在2个alarm()调用之间。
第一个alarm开始计时器,第二个取消它。这里计时器运行10秒。
假如在指定的时间里,第二个alarm没有发生,则产生SIgalRM信号,存储在$SIG{ALRM}里的处理器被调用。
假如在第二个alarm在设定的秒内完成,alarm时钟会终止,eval块成功返回,不会触发ALRM处理器。
注意:
在给定时间内,仅仅一个计时器可用。alarm()的返回值是剩余时间的数量。
所以实际上可利用这点来粗略的估计执行时间。
二、父子进程方式
通过fork(),产生子进程,让子进程执行实际 *** 作;
父进程中设置时间门限sleep();
若子进程成功执行则会自动激发$SIG{CHLD}消息,在消息处理里收集状态;
若不成功,则在父进程中使用kill杀死子进程,
此时也会激发$SIG{CHLD}消息,调用waitpID收集僵尸。并处理状态。 
示例:
用Perl 给命令加上超时退出的功能
#! /usr/bin/env perl
use POSIX qw(strftime WNOHANG);
#check input
my $timeout = shift @ARGV;
my ($secs) = $timeout =~ /--timeout=(\d+)$/;
unless($secs)
  print "Usage: ./timeout --timeout=[SECONDS] [COMMAND] \n";
  exit -1;
#fork and exec
my $status = 0;
$SIG{CHLD} = sub 

  while(waitpID(-1,WNOHANG)>0)
  { 
    $status = -1 unless $? == 0; 
    exit $status;
  } 
};
$0 = 'timeout Hacked ' . $ARGV[0];
defined (my $child = fork);
if($child == 0)
  my $cmd = join ' ',@ARGV;
  exec($cmd);
$SIG{TERM} = sub { kill TERM => $child };
$SIG{INT} = sub { kill INT => $child };
#kill when timeout
sleep $secs;
$status = -1;
kill TERM => $child;
sleep 1 and kill INT => $child if kill 0 => $child;
sleep 1 and kill KILL => $child if kill 0 => $child;
exit $status;

如下调用,就可以让任意的命令超时退出了(这里执行的命令是“sleep 500”)
./timeout.pl --timeout=3 sleep 500
参考文章:
1. http://blog.yikuyiku.com/?tag=perl
2. http://fuzhong1983.blog.163.com/blog/static/16847052010101624315872/ 总结

以上是内存溢出为你收集整理的perl实现超时机制综述全部内容,希望文章能够帮你解决perl实现超时机制综述所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1282515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存