Почему деструктор объекта не вызывается при завершении скрипта? - PullRequest
7 голосов
/ 13 апреля 2010

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 13 апреля 2010

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

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

6 голосов
/ 13 апреля 2010

Вам нужно настроить обработчик сигнала.

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 и корректно завершается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...