James Bryant

【转】dup和dup2用法小结

0
阅读(1293)

今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下。

首先来man一下:

dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就从当前未使用的最小的描述符来取。
而dup2则是可以指定描述符的值,这样通过把文件的描述符指定为STDOUT_FILENO,这样就相当于重定向输出为文件了。

所以有以下程序:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define file_name "dup_test_file"
int main(int argc, char *argv[])
{
    //先调用dup将标准输出拷贝一份,指向真正的标准输出
    int stdout_copy_fd = dup(STDOUT_FILENO);
    int file_fd = open(file_name, O_RDWR);
    //让标准输出指向文件
    dup2(file_fd, STDOUT_FILENO);
    printf("hello\n");
    //恢复标准输出
    dup2(stdout_copy_fd, STDOUT_FILENO);
    printf("world\n");
    return 0;
}

然而,调用的两次printf仍然出现在屏幕上。。hello并没有写入到文件中。
原因是:
第一次printf之后,这些字符串还在缓存中,然而之后将标准输出改回来之后,和再调用printf同时也把之前缓存也输出了,所以给人的感觉上是没有重定向成功。所以得加上这么一句

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define file_name "dup_test_file"
int main(int argc, char *argv[])
{
    //先调用dup将标准输出拷贝一份,指向真正的标准输出
    int stdout_copy_fd = dup(STDOUT_FILENO);
    int file_fd = open(file_name, O_RDWR);
    //让标准输出指向文件
    dup2(file_fd, STDOUT_FILENO);
    printf("hello\n");
    //刷新缓冲区
    fflush(stdout);
    //恢复标准输出
    dup2(stdout_copy_fd, STDOUT_FILENO);
    printf("world\n");
    return 0;
}

此时只会输出world,同时hello写入到文件中