У меня есть небольшая программа, которая запускается до получения SIGINT или до получения двух строк (дважды нажмите enter) от stdin.Логика блока реакции:
react {
whenever signal(SIGINT) {
say "Got signal";
exit;
}
whenever $*IN.lines.Supply {
say "Got line";
exit if $++ == 1 ;
}
}
Программа выйдет на две введенные строки, как и ожидалось.
Однако CTRL-C ничего не сделает, если за ней не следует строка (ввод).
Если я переключаю порядок блоков всякий раз, программа прерывается SIGINT, но не выполняет сигнал всякий раз, когда блок
react {
whenever $*IN.lines.Supply {
say "Got line";
exit if $++ == 1 ;
}
whenever signal(SIGINT) {
say "Got signal";
exit;
}
}
Требуются ли какие-либо другие настройки перед использованиемсигнал саб?Является ли порядок блоков важными в реактивном блоке?
Обновление
Таким образом, кажется, что вызов lines () блокирует выполнение реактивного блока (спасибо @ Håkon).Я вроде понял.
При сравнении с похожей структурой кода для чтения сокетов я все же запутался.Наличие данных (или их отсутствие) не влияет на выполнение обработчика сигнала, и в этом примере он может очень просто читать строки:
my $listener=IO::Socket::Async.listen("0.0.0.0",4432);
react {
whenever $listener {
whenever $_.Supply.lines() {
say "Got line";
}
}
whenever signal(SIGINT) {
say "Got signal";
exit;
}
}
#testing with:
# curl http://localhost:4432
Почему это так отличается от моего исходного кода?