在c中重定向标准输出,然后重置标准输出

时间:2011-07-24 07:50:59

标签: c fcntl unistd.h

我正在尝试使用C中的重定向将输入重定向到一个文件,然后将标准输出设置回打印到屏幕。有人能告诉我这段代码有什么问题吗?

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char** argv) {
    //create file "test" if it doesn't exist and open for writing setting permissions to 777
    int file = open("test", O_CREAT | O_WRONLY, 0777);
    //create another file handle for output
    int current_out = dup(1);

    printf("this will be printed to the screen\n");

    if(dup2(file, 1) < 0) {
        fprintf(stderr, "couldn't redirect output\n");
        return 1;
    }

    printf("this will be printed to the file\n");

    if(dup2(current_out, file) < 0) {
        fprintf(stderr, "couldn't reset output\n");
        return 1;
    }

    printf("and this will be printed to the screen again\n");

    return 0;
}

3 个答案:

答案 0 :(得分:4)

在完成此操作之前,您必须确保做的一件事就是在将fflush(stdout);文件描述符从其下面切换出来之前调用stdout。可能发生的事情是C标准库正在缓冲您的输出,而不知道您正在转移它下面的文件描述符。您使用printf()编写的数据实际 发送到基础文件描述符,直到其缓冲区已满(或您的程序从main返回)。

像这样插入电话:

    fflush(stdout);
    if(dup2(file, 1) < 0) {
在调用dup2()之前

答案 1 :(得分:3)

您的第二次dup2来电错误,请替换为:

if (dup2(current_out, 1) < 0) {

答案 2 :(得分:1)

只需将dup2(current_out, file)替换为dup2(current_out, 1),事情应该会更好。