2012-05-24 3 views
0

Я сделал программу, которая может завершиться двумя способами: либо пользователь вводит строку say - «kill», либо конкретные поточные сигналы SIGINT.perl: прерывание потока заблокировано пользователем

В этом терминатора нить у меня есть заявление (чтобы поймать «убить»):

$a = <>; 

с последующим «возвращением;» У меня есть соответствующий обработчик сигналов (INT) тоже на вершине, которая делает:

print "signal received\n"; 
threads->exit(); 

но в случае автоматического завершения (то есть SIGINT посылается из другого потока), печать STMT не приходит до Я нажимаю какую-то клавишу, независимо от того, как долго я жду. Я полагаю, что <> блокируется.

Может ли кто-нибудь рассказать, как я могу предоставить какой-то ввод <> в случае автоматического завершения, чтобы немедленно увидеть результаты.

Спасибо.

+0

Внутри вызова <> вашего потоку дал управление к ОСАМ. Итак, да, он блокируется до уровня eof. – starbolin

+0

Вам нужно что-то другое, кроме line-i/o, если вы хотите войти. – starbolin

ответ

1

Вы не можете делать то, что вы пытаетесь сделать, как вы пытаетесь это сделать. Если файл читается и «ожидающий ввод», тогда процесс переходит в состояние бесперебойного ожидания. На данный момент вы не можете прерывать его с помощью сигнализации. Бесперебойные ожидания - это ядро, и ключевым моментом является предотвращение повреждения файлов.

Чтобы сделать то, что вы пытаетесь сделать, вам, вероятно, нужно будет использовать что-то вроде IO::Select и функцию can_read. Вы можете проверить, какие дескрипторы файлов готовы для ввода-вывода, в петле опроса - этот цикл опроса - это, прерываемый сигналами kill.

В качестве альтернативы, вместо того, чтобы использовать ссылку на файл для чтения, вы можете использовать Term::ReadKey, который позволит вам поймать нажатие клавиши в неблокируемых модах

Смежные вопросы