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