7

次のようなテスト スクリプトがあります。

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

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

デストラクタは、sleepリターンの後 (およびプログラムが終了する前) に呼び出されます。ただし、スクリプトが Ctrl-C で終了した場合は呼び出されません。この場合もデストラクタを呼び出すことは可能ですか?

4

2 に答える 2

7

ロバートが述べたように、シグナルハンドラーが必要です。
必要なのがオブジェクトデストラクタ呼び出しだけの場合は、次を使用できます。

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

于 2010-04-13T11:53:45.500 に答える
6

シグナルハンドラーを設定する必要があります。

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がスリープを中断し、シグナルハンドラーが設定と呼ばれ$terminate、スリープがすぐに戻り、トップにループし、テスト$terminateして正常に終了します。

于 2010-04-13T11:21:01.927 に答える