LINUX.ORG.RU

[perl] poll, потоки и сигналы. Сегфолт

 


0

0

Хочу использовать в перловом скрипте poll, обрабатывать изменения в потоках и перехватывать Ctrl+C. Допустим, это выглядит так:

#!/usr/bin/perl -w
use strict;
use IO::Poll;
use IO::File;
use threads;

$SIG{'INT'} = sub { print "Bye\n"; exit(0); };

my $f = new IO::File("/dev/urandom", "r");
my $p = new IO::Poll;
$p->mask($f => POLLIN);

while (1) {
	$p->poll(1000);
	my @h = $p->handles(POLLIN);
	foreach (@h) {
		threads->create(\&myread, $_)->detach();
	}
}

sub myread
{
	my $f = shift;
	getc $f;
}
Получаю сегфолт при нажатии Ctrl+C. Похоже, что ещё до выполнения обработчика сигнала, программа просто валится, когда понимает, что надо вызывать не стандартный обработчик. Но валится не всегда, иногда работает. Да я криворучка, некрофил и идиот.

★★★★

Наверное man ppoll и man pselect. А вообще сигналы можно ждать в полле через signalfd.

vga ★★
()

просто не всегда успевает сброситься stdout на консоль, если судишь по отсутствию 'Bye'.

mikki
()

У меня вот так оно вышло

[del@del-arch ~]$ chmod +x 1.pl

[del@del-arch ~]$ ./1.pl

^CBye

[del@del-arch ~]$ ./1.pl

^CBye

[del@del-arch ~]$

[del@del-arch ~]$ ./1.pl

^CBye

panic: corrupt saved stack index at ./1.pl line 7.

[del@del-arch ~]$ ./1.pl

^CBye

[del@del-arch ~]$ ./1.pl

^CBye

[del@del-arch ~]$ ./1.pl

^CBye

Perl exited with active threads:

1 running and unjoined

0 finished and unjoined

0 running and detached

http://www.errorpro.com/perlerrors/perlerror.php?ecode=PERL_ERROR_366

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Gvidon

Попробуйте лучше в обработчике сигнала устанавливать только флаг, а в потоках проверять его.

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.