Я пишу сценарий curses, который требует очистки после обработки SIGINT, чтобы вернуть терминал в исходное состояние.
Я получаю segfault, когда обработчик сигнала включен.
Ради поддержки, я удалил весь код проклятий, чтобы свести проблему к минимуму.
Код:
#!/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
$
Спецификации:
- потоки 1.72
- archname ""
- os ""
- Perl 5.10.1 (поставляется с Debian) Debian
- 6 Squeeze
Начальное впечатление:
Я думаю, что проблема возникает, когда пользовательский обработчик сигнала захватывает управление.Это каким-то образом предотвращает создание следующего потока, что приводит к segfault.
Запускает ли Perl-обработчик SIGINT по умолчанию специальный код для безопасного завершения оценки создания потока?Если это так, я думаю, что решение состоит в том, чтобы скопировать пасту в пользовательский обработчик.