将子进程'stdout和stderr重定向到两个命名管道(然后从它们读回)

时间:2011-03-22 12:23:57

标签: unix redirect named-pipes child-process

我正在开发一个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()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
来自shell的

也可以(但不是来自我的应用程序)。

我无法找到一种直接(或任何)方式从两个管道工作中读取。怎么能实现呢?

2 个答案:

答案 0 :(得分:1)

只试用system(3)代替popen(3);您没有使用FILE*返回的popen(3),因为您没有使用popen(3),因为它本意使用。但是这应该可以从system(3)开始正常工作。

答案 1 :(得分:1)

你应该在output.fifo和error.fifo的文件描述符上调用poll()或select(),并且只有在准备好数据时才调用read()。

我建议您使用pstreams而不是丑陋的命名管道。