Почему мой сценарий Perl с резьбой segfault? - PullRequest
6 голосов
/ 18 февраля 2011

Я пишу сценарий 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 по умолчанию специальный код для безопасного завершения оценки создания потока?Если это так, я думаю, что решение состоит в том, чтобы скопировать пасту в пользовательский обработчик.

1 Ответ

4 голосов
/ 19 февраля 2011

История изменений для модуля threads содержит:

1.73 Mon Jun  8 13:17:04 2009
- Signal handling during thread creation/destruction (John Wright)
- Upgraded ppport.h to Devel::PPPort 3.17

, что свидетельствует о наличии известной проблемы с обработкой сигналов во время создания и удаления потоков в версиях ранее, чем 1.73. Обновите ваш threads модуль.

...