2009-11-16 2 views
1

Предположим, что я запускаю процесс PO через popen (ТОЧНО ТОЧНО) из процесса PA. Я тогда pclose() труба на стороне PA.popen & status of pipe

На стороне PO, как определить, stdout по-прежнему доступен без выполнения write()?

Обратите внимание, что я попытался поймать SIGPIPE на стороне ПО безрезультатно.

ОБНОВЛЕНО: Я пробовал использовать fstat(1, &buf) без успеха.

ОБНОВЛЕНО: Причина, по которой я должен обнаружить это условие через ПО, у меня нет доступа к PID PID из PA (и, следовательно, он не может его убить). Более того, я бы хотел, чтобы PO был более устойчивым в случае сбоев в лице PA, то есть выходил сам по себе.

РЕШЕНИЕ: Я пошел и использовал socketpair, fork. Попытка контролировать процесс через popen оказалась кошмаром (по крайней мере для меня). Большое спасибо всем, кто внес свой вклад!

+0

Почему вы не можете просто отправить PO свой PID через трубу? – Duck

+0

На самом деле кажется, что вы нажимаете пределы popen() здесь. Почему бы вам не пойти на развилку (и т. Д.)? – Duck

+0

@ Duck: я могу отправить PID через STDOUT, но 2 вещи: 1) больше логики с другой стороны, 2) все еще ПО не может совершать харакири, зная состояние трубы STDOUT. – jldupont

ответ

2

Mmm ... pclose() должен дождаться завершения PO до закрытие трубы. В то же время ПО может продолжать писать до конца трубы, по крайней мере, до 4192 байт (ulimit -p раз 512), тогда он должен просто блокироваться.

Возможно, вам потребуется переключиться на pipe()/fork()/dup2()/close(), если вы хотите большего контроля. Если это то, что вы хотите, дайте мне знать, и я отправлю код.

2

PA является потребителем информации (следовательно, он имеет popen() и pclose()).

PO - поставщик, и, следовательно, сервер - в этом случае он знает только, что он пишет в стандартный вывод, но не может определить, к чему привязана stdout. Таким образом, в этом случае ПО не должен знать слишком много о stdout.

Обнаружение EOF должно происходить в программе PA.

Не могли бы вы высказать несколько более подробных сведений о том, почему вам нужно сделать это в ПО?

Смежные вопросы