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在使用警报超时时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

将结构插入地图时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

删除时出现分段错误

在 Swift 中使用 Set 时出现编译器分段错误

在指针迭代中使用 for 循环时出现分段错误

访问共享内存时出现分段错误