gpt4 book ai didi

c - 如何控制 popen stdin、stdout、stderr 重定向?

转载 作者:太空狗 更新时间:2023-10-29 16:23:13 25 4
gpt4 key购买 nike

我对 popen() 如何在 unix 中重定向子进程的 stdin、stdout 和 stderr 感到困惑。 popen() 的手册页在这方面不是很清楚。呼唤

FILE *p = popen("/usr/bin/foo", "w");

派生一个子进程并执行带有参数“-c”、“/usr/bin/foo”的 shell,并将该 shell 的 stdin 重定向(重定向到 foo 的 stdin),stdout 到 p。但是 stderr 会发生什么?它背后的一般原理是什么?

我注意到,如果我在 foo 中打开一个文件(使用 fopen、socket、accept 等),并且父进程没有标准输出,它会被分配到下一个可用的文件编号,即 1,依此类推。这会从 fprintf(stderr, ...) 等调用中产生意想不到的结果。

可以通过写来避免

FILE *p = popen("/usr/bin/foo 2>/dev/null", "w");

在父程序中,但是他们有更好的方法吗?

最佳答案

popen(3) 只是一个库函数,它依赖于 fork(2)pipe(2) 来做真正的事情工作。

然而 pipe(2) 只能创建单向管道。要发送子进程输入并捕获输出,您需要打开两个管道。

如果您也想捕获stderr,那是可能的,但是您需要三个 管道和一个select 循环来在 stdoutstderr 流之间仲裁读取。

有一个例子here对于双管版本。

关于c - 如何控制 popen stdin、stdout、stderr 重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com