1

我正在开发一个 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()ing 在 and 之间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

从外壳也可以(但不是从我的应用程序)。

我找不到一种直接(或任何)方法来从两个工作的管道中读取数据。怎样才能做到这一点?

4

2 回答 2

1

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

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

于 2011-03-22T12:37:42.137 回答
1

尝试system(3)代替popen(3); 你没有使用FILE*返回的 from popen(3),因为你没有使用popen(3)它本来的用途。但这应该可以正常工作system(3)

于 2011-03-22T12:34:29.910 回答