Почему объектный деструктор не называют, когда сценарий завершается?

У меня есть сценарий тестирования как это:

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

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

Деструктор называют после sleep возвраты (и прежде чем программа завершается). Но это не называют, если сценарий завершается с Ctrl-C. Действительно ли возможно назвать деструктор в этом случае также?

7
задан planetp 13 April 2010 в 11:19
поделиться

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 прерывает сон, обработчик сигнала называется настройкой $terminate, сон немедленно возвращается, он зацикливается на вершине, тестирует $terminate и выходит изящно.

6
ответ дан 6 December 2019 в 19:35
поделиться

Как упоминал Роберт , вам понадобится обработчик сигнала.
Если вам нужен только вызов деструктора объекта, вы можете использовать это:

$ SIG {INT} = sub {die "поймал SIGINT \ n"}; .

7
ответ дан 6 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: