Redirect standard error to a string in C
我希望能够将stderr重定向到C字符串,因为我需要在我正在编写的程序中使用该字符串。
我想避免写入文件(在硬盘上),然后读取文件以获取字符串。
完成这项工作的最佳方法是什么?
您可以使用setbuf()来更改stderr的缓冲区:
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h>
int main (void)
{
char buf [BUFSIZ ];
setbuf(stderr , buf );
fprintf(stderr ,"Hello, world!
");
printf("%s", buf );
return 0;
} |
打印:
1 2
| Hello, world!
Hello, world! |
注意:您应该在流上的任何操作之前更改缓冲区。
-
不错哦!不知道你甚至可以做到这一点!在stdio中定义了BUFSIZ吗?
-
@mtahmed是的,手册页中有更多信息,如果使用setvbuf(),也可以设置缓冲模式
-
我喜欢这个解决方案,在我测试之后我会接受。
-
当'buf'被写入时,有没有办法获得回调?
-
@ user1660675不是我所知道的,也许如果你对fd使用select不
-
-1因为这是一个黑客。 setbuf使用的缓冲区仅供框架使用。这只适用于(a)你立即调用setbuf fprintf,并且你的字符串完全适合BUFSIZ(或者如果缓冲区用作乒乓球,甚至可能限于BUFSIZ/2,取决于黑暗stdio的实现细节)。
-
我认为这不适用于子流程,即。 system("/bin/echo foo > /dev/stderr");,因为您只是将流接口的缓冲更改为stderr,而不是实际的stderr文件描述符。
将stderr重定向到stdout并管道到你的C程序。 请参阅如何管道stderr,而不是stdout?
当然,请阅读C程序中的stdin。
这是假设stderr来自另一个程序。 如果要从程序和进程中捕获所有stderr输出,则在单独的线程中通过fopen("/dev/stderr","r")侦听对stderr的写入。
-
我会试一试。我试图从程序中捕获stderr并在同一个程序中使用它,所以,我会在stderr上使用fopen然后重定向到stdout?
我使用C ++给出了一个解决方案,将stdout和stderr重定向到一个函数(为每一行调用)。 我知道这被标记为C,但我的解决方案的胆量使用POSIX api。
请参阅https://stackoverflow.com/a/25087408/364818