我正在开发一个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的也可以(但不是来自我的应用程序)。
我无法找到一种直接(或任何)方式从两个管道工作中读取。怎么能实现呢?
答案 0 :(得分:1)
只试用system(3)
代替popen(3)
;您没有使用FILE*
返回的popen(3)
,因为您没有使用popen(3)
,因为它本意使用。但是这应该可以从system(3)
开始正常工作。
答案 1 :(得分:1)
你应该在output.fifo和error.fifo的文件描述符上调用poll()或select(),并且只有在准备好数据时才调用read()。
我建议您使用pstreams而不是丑陋的命名管道。