perl实现超时机制综述

来源:互联网 发布:房屋装修设计图软件 编辑:程序博客网 时间:2024/05/17 03:19
一、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/

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学了栏目包装不想干怎么办 在文本打字乱了怎么办 体考后觉得成绩有出入怎么办 荧光棒进眼睛里怎么办 无法读源文件或磁盘怎么办 爱剪辑视频横着怎么办 pr界面字体太小怎么办 0p手机卡槽坏了怎么办 pr视频有水波纹怎么办 手机耳机插口插上没声音怎么办 xp系统电脑没有声音怎么办 win10笔记本耳机没声音怎么办 电脑插耳机还是外放怎么办 主机电脑耳机插孔坏了怎么办 苹果6plus有点卡怎么办 手机拨通电话后黑屏怎么办 手机拨通后没声音怎么办 苹果手机铃声不响了怎么办 婴儿喘气粗好像有痰怎么办 金毛呼吸声很大怎么办 回看福建导视该怎么办 楼上木地板走路声音都很响怎么办 班里团支不搭理我我该怎么办 客户买家具说贵怎么办 英雄联盟超出显示范围怎么办 脸上有斑点怎么办内条 脖子扭到了一动就疼怎么办 杭州限行在路上怎么办 在路上限行了怎么办 微信号不能进群怎么办 在微信约妹子被骗2000怎么办 qq号进不了热聊怎么办 网上买彩票中五百万怎么办 别人登我支付宝怎么办 医保刷卡刷到现金支付怎么办 微信诈骗立案后怎么办 奔跑吧诈骗填写了身份证怎么办 快手绑定的手机号丢了怎么办 球球大作战绑定手机号丢了怎么办 快手绑定手机号丢了怎么办 绑定银行卡的手机号丢了怎么办