【转】dup和dup2用法小结
0赞
发表于 2016/9/7 10:57:17
阅读(1285)
今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下。
首先来man一下:
dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就从当前未使用的最小的描述符来取。
而dup2则是可以指定描述符的值,这样通过把文件的描述符指定为STDOUT_FILENO,这样就相当于重定向输出为文件了。
所以有以下程序:
#include #include #include #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 #include #include #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写入到文件中