是否打开了一个文件来代替stderr缓冲?

时间:2014-05-13 15:21:51

标签: c linux

在Linux上,stdout(fd 1)输出流被缓冲,而stderr(fd 2)则没有。

说我做这样的事情:


int main() {
    close(2);
    open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
    fprintf(stderr, "This is in the text file!");
    fflush(stderr);  //does this do anything? is it needed?
    return 0;
}

如果我没记错的话,open使用最低的可用文件描述符,该描述符应为2(在close语句之前用作stderr)。由于stderr未缓冲,newfile.txt也不会被缓冲吗?或者fd 2曾经用于stderr

并不重要

2 个答案:

答案 0 :(得分:3)

你实际上并没有对stderr做任何事情,所以它的状态和缓冲不变。您所做的只是更改基础文件描述符( 如果 open调用当然没有失败)。


如果不关闭旧文件描述符,则可以通过保存返回的文件描述符open并使用dupdup2来执行相同的操作。我实际上建议使用dup2代替,因为它更明确,更容易理解正在发生的事情:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    int fd = open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
    if (fd == -1) {
        perror("open");
        return EXIT_FAILURE;
    }

    if (dup2(STDERR_FILENO, fd) == -1) {
        perror("dup2");
        return EXIT_FAILURE;
    }

    fprintf(stderr, "This is in the text file!");

    return EXIT_SUCCESS;
}

答案 1 :(得分:-1)

我认为你的代码很可能会出错,因为fflush()期望FILE*不是Unix文件描述符。

fprintf()缓冲输出。它并不知道任何不同,因为文件描述符并没有因此而改变,因此仍然需要fflush()