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