Перенаправление stdout и stderr дочернего процесса на два именованных канала (затем чтение из них) - PullRequest
1 голос
/ 22 марта 2011

Я работаю над приложением, которое выполняет popen () другого процесса, чей вывод - и stderr, и stderr - необходимо перенаправить на два именованных канала, также созданных приложением.Затем мне нужно прочитать данные обратно из каналов.

mkfifo("output.fifo", 0666); // error checks etc.
mkfifo("error.fifo", 0666); // error checks etc.
popen("cstuff 'param' < input.txt 1> output.fifo 2> error.fifo", "r");

не работает: приложение зависает, когда я пытаюсь прочитать с error.fifo .sleep() ing / wait() между mkfifo() и popen() также не работает.

// output.txt is the result from a file dialog
popen("cstuff 'param' < input.txt 1> output.txt 2> error.fifo", "r");

работает.

popen("cstuff 'param' < input.txt 1> output.fifo", "r");

также работает.

$ cstuff 'param' < input.txt 1> output.txt 2> output.txt

из оболочки также работает (но не из моего приложения).

Я не смог найти простой (или какой-либо) способ заставить чтение из обоих каналов работать.Как этого достичь?

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Вы должны вызывать poll () или select () для файловых дескрипторов output.fifo и error.fifo и вызывать read () только тогда, когда данные готовы.

Я предлагаю вам использовать pstreams вместо некрасивых именованных каналов.

1 голос
/ 22 марта 2011

Попробуйте просто system(3) вместо popen(3);вы не используете FILE*, возвращаемое из popen(3), потому что вы не используете popen(3), как предполагалось.Но это должно хорошо работать с system(3).

...