У меня есть Perl-скрипт, который выполняет вилку.
Каждая вилка запускает внешнюю программу, анализирует вывод и преобразует вывод в хранимый файл.
Сохраняемые файлы затем считываются родителем, и перед переходом к повторению предыдущей вилки анализируются общие данные от каждого из потомков, в противном случае родитель останавливается.
Что именно происходит, когда я запускаю ^ C в то время как некоторые дети еще запускают внешнюю программу? Родительский сценарий perl был вызван на переднем плане и, как я полагаю, оставался на переднем плане, несмотря на разветвление.
Передается ли SIGINT всем дочерним элементам, то есть родителю, дочерним элементам родителя, и внешняя программа, вызываемая дочерними элементами ??
UPDATE :
Я должен добавить, похоже, что когда я выдаю SIGINIT, внешняя программа, вызываемая дочерними элементами моего сценария, похоже, подтверждает сигнал и прекратить. Но дети или, возможно, родительская программа продолжают. Мне все это непонятно.
ОБНОВЛЕНИЕ 2 :
Что касается комментария Христа, внешняя программа вызывается командой Perl system ()
.
Фактически, tchrist's комментарий также, кажется, содержит объяснение, которое я искал. После некоторой дополнительной отладки, основанной на поведении моей программы, выяснилось, что действительно SIGINT передается от родителя всем потомкам и от всех потомков всем своим потомкам (внешней программе).
Итак, что кажется, что происходит, основываясь на комментарии Христа, заключается в том, что CTRL-C убивает внешнюю программу, которая заставляет детей выходить из команды system ()
- и ничего более.
Хотя я попросил своих детей проверить статус выхода того, что было вызвано в system ()
я предполагал, что CTRL-C убьет все, начиная с родителя и ниже, а не приведет к созданию дополнительных циклов обработки, что и происходило !!!
РЕШЕНИЕ (к моей проблеме) :
Мне нужно просто создать обработчик сигнала для SIGINT в родительском элементе. Затем обработчик сигнала отправит SIGTERM каждому из дочерних элементов (который, как я предполагаю, также отправит SIGTERM дочерним элементам), а затем заставит родительский элемент корректно выйти. Хотя это несколько очевидное решение, вероятно, исправило бы ситуацию, Я хотел понять свое неправильное представление о поведении SIGINT в отношении разветвления в Perl.