了解stdout,stderr和stdin

时间:2014-06-02 10:09:15

标签: linux file unix operating-system

root@C6903:/ # ls -l /proc/327/fd/
lrwx------ root     root              1970-02-11 01:40 0 -> /dev/null
lrwx------ root     root              1970-02-11 01:40 1 -> /dev/null
lrwx------ root     root              1970-02-11 01:40 2 -> /dev/null

正如我所看到的,所有(0,1,2)都指向/ dev / null。为什么?他们内部有何不同?

在我的案例中(Coredump环境),fd的列表是这样的。

root@C6903:/ # ls -l /proc/5987/fd/                            
lr-x------ root     root              1970-02-11 01:34 0 -> pipe:[31608]

所以stdout和stderr文件不存在。在这种情况下,如果我给出printf(),我将面临未定义的行为(其他打开的文件被覆盖)。要解决这个问题, 我正在做类似下面的事情:

int check_fd(int fd)
{
    return (fcntl(fd, F_GETFD) != -1);
}

...

    if (!check_fd(STDOUT_FILENO))
        fopen("/dev/null", "w");

    if (!check_fd(STDERR_FILENO))
        fopen("/dev/null", "w");

这很好用。但我担心如果我做错了什么。如果我必须打开它们,我如何区分stdout和stderr?

2 个答案:

答案 0 :(得分:0)

stdoutstdinstderr根据程序的启动方式指向不同的管道或套接字。在第一种情况下,它们都被重定向到/dev/null,因此标准输出上没有任何输出,对于输入,使用/dev/null是传递空文件的便捷方式。 / p>

如果您需要区分它们,则需要将它们重定向到不同的文件。在这种情况下,对两者使用/dev/null并不是一个好主意。例如,您可以打开两个不同的文件:program.stdoutprogram.stderr,然后分别写入

答案 1 :(得分:0)

如果stdout和stderr已经关闭并且你想重新打开它们,请尝试:

freopen( "/dev/null", "w", stdout );