popen & статус трубы - PullRequest
       22

popen & статус трубы

1 голос
/ 16 ноября 2009

Допустим, я создал процесс PO через popen (ТОЛЬКО ЧИТАТЬ) из процесса PA. Затем я pclose() труба на стороне ПА.

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 17 ноября 2009

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

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

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

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

2 голосов
/ 17 ноября 2009

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

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

...