Perl中的alarm、eval、die的联合使用
2017-08-23 14:02
357 查看
1. eval:
eval是一个表达式,而不是if和while这样的控制结构,eval块发生严重错误时,eval块会停止执行,但程序不会崩溃。所以在程序中执行有可能引起严重错误的代码块,但又不想影响后续程序的执行时,可以把这部分代码块放入eval中。eva块正常执行,还是发生了严重错误,放在$@中,如果没错,$@为空,否则存放错误的原因。可以用$@的boolean值判断结果:print $@ if $@.
有四种类型的错误,eval不能捕捉,例如内存不足等系统错误,perl都没法跑起来。
想退出eval代码块,用的是die,而不是exit;
2. alarm:
alarm exp;
alarm;
如果exp被忽略,则用$ _的值来代替。实际的时间延迟是不准确的,因为不同的系统实现了不同的报警功能。实际时间可能是可达的第二或小于所请求的值。 在任何一个时间内只能设置一个闹钟定时器。
eg1:
$timeout=5;
eval {
local $SIG{ALRM} = sub { die "after $timeout seconds,run alarm\n" }; #设置超时时的处理函数
alarm $timeout;
sleep 10;
print "in alarm eval\n";
alarm (0); #程序运行完成,取消前面的超时处理,并且不会开启一个新的超时操作。
};
print "out of alarm eval\n";
if ($@) {
if ($@ =~ /die in sig alarm/) {
print "caught the error";
}
else {
print $@;
}
}
output:
# perl test.pl
out of alarm eval
after 5 second,run alarm
解析:因为在eval块中,设置了alarm 5;之后,运行后面的代码块,5s后已经超时了,程序还只运行在sleep 5,所以eval里面的print未执行;
如果将sleep 10换成sleep 2:
# perl test.pl
in alarm eval
out of alarm eval
所以如果alarm $timeout和alarm 0之间的代码运行时间超过了$timeout,就会die,退出eval;
eg2:
$SIG{ALRM} = sub {
system("killall -9 firefox") or warn "Fail to kill firefox process \n";
};
alarm 20;
system("firefox");
alarm 0;
解析:
在运行这段代码的时候,firefox最后并没有被kill掉,那是因为alarm 20和alarm0之间的代码运行时间没有超过20s,然后alarm 0已经取消了超时操作。
如果想在20s后,kill掉firefox,可以如下:
$SIG{ALRM} = sub {
system("killall -9 firefox") or warn "Fail to kill firefox process \n";
};
alarm 20;
system("firefox");
sleep 21;
alarm 0;
eval是一个表达式,而不是if和while这样的控制结构,eval块发生严重错误时,eval块会停止执行,但程序不会崩溃。所以在程序中执行有可能引起严重错误的代码块,但又不想影响后续程序的执行时,可以把这部分代码块放入eval中。eva块正常执行,还是发生了严重错误,放在$@中,如果没错,$@为空,否则存放错误的原因。可以用$@的boolean值判断结果:print $@ if $@.
有四种类型的错误,eval不能捕捉,例如内存不足等系统错误,perl都没法跑起来。
想退出eval代码块,用的是die,而不是exit;
2. alarm:
alarm exp;
alarm;
如果exp被忽略,则用$ _的值来代替。实际的时间延迟是不准确的,因为不同的系统实现了不同的报警功能。实际时间可能是可达的第二或小于所请求的值。 在任何一个时间内只能设置一个闹钟定时器。
eg1:
$timeout=5;
eval {
local $SIG{ALRM} = sub { die "after $timeout seconds,run alarm\n" }; #设置超时时的处理函数
alarm $timeout;
sleep 10;
print "in alarm eval\n";
alarm (0); #程序运行完成,取消前面的超时处理,并且不会开启一个新的超时操作。
};
print "out of alarm eval\n";
if ($@) {
if ($@ =~ /die in sig alarm/) {
print "caught the error";
}
else {
print $@;
}
}
output:
# perl test.pl
out of alarm eval
after 5 second,run alarm
解析:因为在eval块中,设置了alarm 5;之后,运行后面的代码块,5s后已经超时了,程序还只运行在sleep 5,所以eval里面的print未执行;
如果将sleep 10换成sleep 2:
# perl test.pl
in alarm eval
out of alarm eval
所以如果alarm $timeout和alarm 0之间的代码运行时间超过了$timeout,就会die,退出eval;
eg2:
$SIG{ALRM} = sub {
system("killall -9 firefox") or warn "Fail to kill firefox process \n";
};
alarm 20;
system("firefox");
alarm 0;
解析:
在运行这段代码的时候,firefox最后并没有被kill掉,那是因为alarm 20和alarm0之间的代码运行时间没有超过20s,然后alarm 0已经取消了超时操作。
如果想在20s后,kill掉firefox,可以如下:
$SIG{ALRM} = sub {
system("killall -9 firefox") or warn "Fail to kill firefox process \n";
};
alarm 20;
system("firefox");
sleep 21;
alarm 0;
相关文章推荐
- Perl中定时器alarm的die与kill
- Perl eval函数使用实例
- Perl中定时器alarm的die与kill
- perl 的eval中,不应当使用 next
- Perl中定时器alarm的die与kill
- perl eval两种使用方式
- 【转】Perl的die、warn、eval函数
- Bind()方法与Eval()方法的区别与使用
- Perl技巧 sort函数使用
- 使用 perl 快速解析 apache log
- Ubuntu14下OpenCV3和QT5的安装及联合使用
- 使用beanShell来解析执行java的String方法,类似javascipt的eval方法
- 使用Hibernate配置联合主键的两种方式
- 关于pvr和plist的联合使用
- RTG-tools的安装与子工具vcfeval的使用
- 联合使用业务代理和DAO模式
- RXJava与Retrofit联合使用
- 使用perl编写socket程序范例
- Hibernate的onetomany和manytoone联合使用(十八)
- hibernate中联合主键的使用