【问题标题】:Why is object destructor not called when script terminates?为什么脚本终止时不调用对象析构函数?
【发布时间】:2010-04-13 11:19:15
【问题描述】:

我有一个这样的测试脚本:

package Test;
sub new { bless {} }
sub DESTROY { print "in DESTROY\n" }

package main;
my $t = new Test;
sleep 10;

sleep 返回之后(以及在程序终止之前)调用析构函数。但如果脚本以 Ctrl-C 终止,则不会调用它。在这种情况下是否也可以调用析构函数?

【问题讨论】:

    标签: perl signals destroy


    【解决方案1】:

    作为 Robert mentioned,您需要一个信号处理程序。
    如果你只需要对象析构函数调用,你可以使用这个:

    $SIG{INT} = sub { die "caught SIGINT\n" };.

    【讨论】:

      【解决方案2】:

      您必须设置一个信号处理程序。

      package Test;
      sub new { bless {} }
      sub DESTROY { print "in DESTROY\n" }
      
      package main;
      
      my $terminate = 0;
      
      $SIG{INT} = \&sigint;
      
      sub sigint { $terminate = 1; }
      
      my $t = new Test;
      
      while (1) {
          last if $terminate;
          sleep 10;
      }
      

      类似的东西。然后在你的主循环中检查$terminate,如果它设置正常退出程序。

      发生的情况是cntl-c中断了sleep,信号处理程序被称为设置$terminate,sleep立即返回,它循环到顶部,测试$terminate并优雅地退出。

      【讨论】:

        猜你喜欢
        • 2014-06-13
        • 2023-03-20
        • 2010-10-16
        • 2011-08-03
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 2019-11-16
        • 1970-01-01
        相关资源
        最近更新 更多