2016-12-14 12 views
0

Рассмотрим два процесса, A и B, со стандартными входными и выходными потоками, соединенными друг с другом через каналы для формирования замкнутого контура. Предположим, что в результате exec два процесса непосредственно не осознают свою связь друг с другом.Прослушать сигнал от процесса через pid

Если B резко прекращено (например, отправив его SIGKILL), как A может знать, что B умер? Или, по крайней мере, сделать тоже умер

Быстрый взгляд на ситуацию, где ЦМД А и B Клиент: enter image description here

+0

Я не понимаю, «Сам исполнитель с другой программой». Является ли выполнение того же самого бинарного файла уже запущенным? Выполняет ли он другой бинарный файл? Является ли это первым? –

+0

Какова природа диалога с каналами между процессами? –

+0

Вы имеете в виду трубы 'pipe' (2), верно? Не FIFO (иначе называемые «трубы»), записанные в файловой системе? –

ответ

1

Как я понимаю, единственное, с чем вам нужно работать, это трубы. Ничто другое, что могло бы помочь вам, не переносило exec, особенно если мы предполагаем, что работающая программа A специально не предназначена для этого взаимодействия. Поэтому давайте рассмотрим, что вы можете делать с трубами.

Когда B завершается, по какой-либо причине все его открытые дескрипторы файлов закрыты. Это включает его ручки на концах трубы.

Если затем пытается написать свою собственную stdout и прочитать конец не открыт в любом процессе, * тогда А получит SIGPIPE, как заметил @indianant. Распознавание по умолчанию для этого сигнала - это прекращение процесса, поэтому A также умрет, если только он не изменил расположение этого сигнала. Если A изменение расположения SIGPIPE не работает, если только программа не работает A - это номер, который вы предоставили.

Но возможно будет заблокирован чтение из стандартного ввода, когда B заканчивается. Предположим, что B был единственным процессом, в котором был открыт конец записи этой трубки, A будет видеть EOF на его стандартном входе. Это автоматически не приведет к завершению работы A, но оно может соответствующим образом отреагировать на это событие, что может привести к его естественному завершению. Кроме того, A может сначала получить данные, составленные B до его прекращения; если A отвечает, пытаясь записать его на стандартный вывод, применяется предыдущий параграф.

Ничего из этого не применяется, если только A фактически выполняет ввод-вывод на своих стандартных потоках. Если вы ищете какое-то асинхронное уведомление, то вам, вероятно, нужно будет возложить ответственность за третий процесс. Для этой цели было бы проще дать A и B общий родительский процесс, возможно, посвященный цели. Родитель будет уведомлен через SIGCHLD или возвращаться с wait() или waitpid(), когда один из его детей умирает; он мог бы предпринять соответствующие действия, такие как убийство другого ребенка.Обратите внимание, что это не работает для A, являющегося родительским элементом B, или vise versa, поскольку обработчики сигналов не переносятся над exec, за исключением, возможно, SIG_IGN для SIGCHLD.

* В частности, убедитесь, что прочитать конец не открыт в , закрыв его перед ехесом.

+0

Но как можно увидеть EOF, если он исполнит? Должен ли я делать поток, который имеет pid A, и заставить его попытаться узнать, когда B мертв, проверяя существование труб? К сожалению, я не могу сделать последнее предложение ... Я должен следовать этой архитектуре для школьного проекта ... – Pixeuh

+0

@ThomasPetillot, как я уже сказал, если у вас есть только трубы, на которые можно положиться, тогда вы можете только обнаруживать состояние другого процесса, когда вы выполняете операции ввода-вывода. И вы можете делать это только в нормальном курсе * ввода/вывода вашей программы, потому что в противном случае вы будете вмешиваться в поведение программы. –

+0

Итак, я сделал A, отправляя его pid на выходе, и B поймал его, чтобы он мог убить его, когда захочет. спасибо за помощь – Pixeuh

1

«А» получает сигнал SIGPIPE, когда он пишет в трубу, где потребитель погибает.

Вы можете зарегистрировать обработчик для SIGPIPE и обработать его изящно.

+0

Это было бы возможно, если на процесс А можно было попытаться написать в трубу после завершения B. То, что действительно описывает сценарий ОП, невозможно определить на основе имеющейся в настоящее время информации. –

+0

Не работает, потому что если у A есть обработка блока, когда B умер, он никогда не узнает ... – Pixeuh