查看来自c-library,Debian Linux的stderr

时间:2015-12-18 10:33:50

标签: c linux debugging file-descriptor stderr

我对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"

非常感谢任何帮助......

1 个答案:

答案 0 :(得分:1)

stderr不是应用程序,它只是控制台上的另一个输出流,就像stdout一样。主要区别在于stderr不是(通常)缓冲的,并且如果您将程序的输出传送到某处,则默认情况下不会重定向。例如,如果您键入:

program > file.txt

stdout流上的节目输出将被重定向到file.txt,但stderr流上打印的任何内容仍将显示在控制台上,而不会写入文件。 (正如23ars在评论中所暗示的那样,重定向stderr的方法是使用2>&1stderr重定向到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 并且您应该看不到控制台上打印的任何内容,但检查文件应该显示两条线都已发送到那里。

我希望这有点清除它:)。