c popen 不会捕获 stderr
我正在尝试使用 popen() 来捕获调用的 stderr,但当然它似乎并没有这样做。有什么想法吗?
我的代码看起来或多或少像这样:
popen("nedit", "r");
但是我在屏幕上看到了所有关于非 utf8 的垃圾......
I'm trying to use popen()
to catch the stderr of a call, but of course it doesn't seem to be doing that. Any ideas?
My code looks more or less like this:
popen("nedit", "r");
But I'm getting all this garbage about non-utf8 on my screen...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
popen
为您提供进程标准输出上的文件句柄,而不是其标准错误。它的第一个参数被解释为 shell 命令,因此您可以在其中进行重定向:或者,如果您根本不需要 stdout,
(除
/dev/null
之外的任何其他文件都可以接受出色地。)popen
gives you a file handle on a process' stdout, not its stderr. Its first argument is interpreted as a shell command, so you can do redirections in it:or, if you don't want the stdout at all,
(Any other file besides
/dev/null
is acceptable as well.)如果你想放弃所有的错误消息,那么你可以使用:
If you want to discard all of the error messages, then you can use:
如果您同时需要 stdout 和 stderr 流,则可以打开一个额外的管道并将子 stderr 重定向到它:
正如 Andrew 指出的,如果
command
生成大量输出/错误,则必须更仔细地处理流(见下面的评论)。if you need both stdout and stderr streams, you can open an extra pipe and redirect child stderr to it:
As Andrew pointed out, if
command
generates lots of output/errors, you must handle the streams more carefully (see comments below).安德烈·路易斯·达席尔瓦·蒙泰罗的解决方案确实非常出色。
只是为了提供额外的选择,我添加了下面的提案。取代了 popen(),而是创建了一个新进程,提供所有连接管道 - stdin、stdout 和 stderr。
安德鲁·亨利 (Andrew Henle) 的评论也适用。
The solution of Andre Luis da Silva Monteiro is really brilliant.
Just for additional choice, I am adding the proposal below. Instead of popen(), a new process is forked, supplying all connecting pipes - stdin, stdout and stderr.
The comment of Andrew Henle applies as well.