Perl在使用警报超时时出现分段错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl在使用警报超时时出现分段错误相关的知识,希望对你有一定的参考价值。
我是第一次写Perl,Internet告诉我,如果我的SQL查询运行时间很长,我可以使用Alarm。我需要运行一个将在Perl中运行数小时的SP,我想设置一个时间限制。以下是我代码的最后一步,但是当进程运行的时间长于我的超时时间(此时是sleep(20))时,我会得到segmentation fault。日志显示它完成打印--- 1 ----然后出现分段错误。我该如何解决?
我尝试将sub DelRef 取出到单独的.pl中,并在第三行中注释$ db部分,以测试警报是否工作正常,并且一切正常。我很困惑哪一部分出错了并导致了分割错误。
sub DelRef
print "starting defRefData\n";
$db = new Sybapi($user, $password, $server, $margin_database);
print "entering eval\n";
my $timeout = 10;
eval
local $SIGALRM = sub die "timeout\n" ;
print "inside eval now\n";
alarm($timeout);
print "---1----\n";
#sleep(5); --working fine
sleep(20); #not working,
#$db->exec_sql("exec CPN_Margins..clean_up_refData_db '$XrefCode'");
print "----2----\n";
alarm(0);
;
#alarm(0);
print "out of eval\n";
if($@)
#die unless $@ eq "timeout\n";
if($@ =~ "timeout\n")
warn "Timed out!\n";
#exit 0;
else
print $@;
&DelRef();
print "process is done\n";
$db->close();
答案
从perldoc(https://perldoc.perl.org/functions/alarm.html)-
通常将警报和睡眠呼叫混为一谈是错误的,因为可以在系统上通过警报在内部实现睡眠。
如果要实现超时,则可以不睡觉而实现。只需遵循链接中提到的示例即可。
编辑:我在这里添加了它-How to set timeout for a long running Sybase sp in Perl
以上是关于Perl在使用警报超时时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章