Что происходит с SIGINT (^ C) при отправке в сценарий Perl, содержащий детей?

У меня есть Perl-скрипт, который выполняет вилку.

Каждая вилка запускает внешнюю программу, анализирует вывод и преобразует вывод в хранимый файл.

Сохраняемые файлы затем считываются родителем, и перед переходом к повторению предыдущей вилки анализируются общие данные от каждого из потомков, в противном случае родитель останавливается.

Что именно происходит, когда я запускаю ^ C в то время как некоторые дети еще запускают внешнюю программу? Родительский сценарий perl был вызван на переднем плане и, как я полагаю, оставался на переднем плане, несмотря на разветвление.

Передается ли SIGINT всем дочерним элементам, то есть родителю, дочерним элементам родителя, и внешняя программа, вызываемая дочерними элементами ??

UPDATE :

Я должен добавить, похоже, что когда я выдаю SIGINIT, внешняя программа, вызываемая дочерними элементами моего сценария, похоже, подтверждает сигнал и прекратить. Но дети или, возможно, родительская программа продолжают. Мне все это непонятно.

ОБНОВЛЕНИЕ 2 :

Что касается комментария Христа, внешняя программа вызывается командой Perl system () .

Фактически, tchrist's комментарий также, кажется, содержит объяснение, которое я искал. После некоторой дополнительной отладки, основанной на поведении моей программы, выяснилось, что действительно SIGINT передается от родителя всем потомкам и от всех потомков всем своим потомкам (внешней программе).

Итак, что кажется, что происходит, основываясь на комментарии Христа, заключается в том, что CTRL-C убивает внешнюю программу, которая заставляет детей выходить из команды system () - и ничего более.

Хотя я попросил своих детей проверить статус выхода того, что было вызвано в system () я предполагал, что CTRL-C убьет все, начиная с родителя и ниже, а не приведет к созданию дополнительных циклов обработки, что и происходило !!!

РЕШЕНИЕ (к моей проблеме) :

Мне нужно просто создать обработчик сигнала для SIGINT в родительском элементе. Затем обработчик сигнала отправит SIGTERM каждому из дочерних элементов (который, как я предполагаю, также отправит SIGTERM дочерним элементам), а затем заставит родительский элемент корректно выйти. Хотя это несколько очевидное решение, вероятно, исправило бы ситуацию, Я хотел понять свое неправильное представление о поведении SIGINT в отношении разветвления в Perl.

14
задан EMiller 17 January 2011 в 23:07
поделиться