我对Linux编程非常陌生,只是在学习操作系统的方法。我已经申请了,但它没有按预期工作。我使用library来启用某些功能。在库的源代码中,我看到定义了一个宏:
#ifdef __DEBUG
#define DEBUG_PRINTF(FORMAT, ...) fprintf(stderr, FORMAT, ## __VA_ARGS__)
#else
#define DEBUG_PRINTF(FORMAT, ...)
#endif
我想看到消息发送 DEBUG_PRINTF ,所以我想我需要一种方法来查看 stderr .. 我不清楚如何做到这一点。我已经进行了一些研究,但似乎无法访问应用程序的文件描述符。
我使用BeagleBone Black,运行Debian Distribution" Linux beaglebone 3.8.13-bone47"
非常感谢任何帮助......
答案 0 :(得分:1)
stderr
不是应用程序,它只是控制台上的另一个输出流,就像stdout
一样。主要区别在于stderr
不是(通常)缓冲的,并且如果您将程序的输出传送到某处,则默认情况下不会重定向。例如,如果您键入:
program > file.txt
stdout
流上的节目输出将被重定向到file.txt
,但stderr
流上打印的任何内容仍将显示在控制台上,而不会写入文件。 (正如23ars在评论中所暗示的那样,重定向stderr的方法是使用2>&1
将stderr
重定向到stdout
)。
与阅读stderr
相比,阅读stdout
并不需要做任何不同的事情。它应该出现在控制台上。 printf
默认输出为stdout
,这就是您必须使用fprintf
的原因,因为这样您可以指定不同的输出流 - stderr
。
示例:
尝试以下简单的hello world程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("I am printed on stdout\n");
fprintf(stderr, "I am printed on stderr\n");
return 0;
}
编译并运行它,您应该看到:
I am printed on stdout
I am printed on stderr
现在运行它,但管道到文件:
program > file.txt
你现在应该只看到:
I am printed on stderr
出现在您的控制台上。
如果你检查file.txt
,你应该只看到
I am printed on stdout
最后你可以试试program > file.txt 2>&1
并且您应该看不到控制台上打印的任何内容,但检查文件应该显示两条线都已发送到那里。
我希望这有点清除它:)。