Я пишу сценарий curses, который требует очистки после обработки SIGINT, чтобы вернуть терминал в исходное состояние.
Я получаю segfault, когда включен обработчик сигнала.
Для ради поддержки, Я удалил весь код curses, чтобы решить проблему.
Код:
#!/usr/bin/env perl
use strict;
use warnings;
use threads;
sub cleanup { exit 0; }
sub run { while (1) {} }
# comment this line and the problem disappears
$SIG{INT} = \&cleanup;
foreach my $i (1..100) {
print "Creating this thread\n";
my $t = threads->create(\&run);
print "Created that thread\n";
}
while (1) { print "Looping\n"; }
Образец трассировки ошибок (ошибки в 90% случаев):
$ ./threadtest.perl
...
Creating this thread
Creating that thread
Detaching this thread
Detaching that thread
Creating this thread
^CSegmentation fault
$
Спецификации:
Начальное впечатление:
Я думаю, что проблема возникает, когда пользовательский обработчик сигналов захватывает управление. Это каким-то образом предотвращает создание следующего потока, что приводит к ошибке segfault.
Выполняет ли обработчик SIGINT Perl по умолчанию специальный код для безопасного завершения оценки создания потока? Если так, то я полагаю, что решение состоит в том, чтобы скопировать пасту в специальный обработчик.