Как я понимаю, единственное, с чем вам нужно работать, это трубы. Ничто другое, что могло бы помочь вам, не переносило 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
.
* В частности, убедитесь, что прочитать конец не открыт в , закрыв его перед ехесом.
Я не понимаю, «Сам исполнитель с другой программой». Является ли выполнение того же самого бинарного файла уже запущенным? Выполняет ли он другой бинарный файл? Является ли это первым? –
Какова природа диалога с каналами между процессами? –
Вы имеете в виду трубы 'pipe' (2), верно? Не FIFO (иначе называемые «трубы»), записанные в файловой системе? –