zoukankan      html  css  js  c++  java
  • dup和dup2用法小结

    今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到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
    ");
        //恢复标准输出
        dup2(stdout_copy_fd, STDOUT_FILENO);
        printf("world
    ");
        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
    ");
        //刷新缓冲区
        fflush(stdout);
        //恢复标准输出
        dup2(stdout_copy_fd, STDOUT_FILENO);
        printf("world
    ");
        return 0;
    }
    

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

  • 相关阅读:
    Python开发环境搭建
    Python逻辑判断顺序
    PyCharm快捷改变字体大小
    Python类型转换
    前端面试总结2020
    问题总结20-11-02至20-11-09
    问题总结20-11-30至20-12-06
    项目管理培训20-12-06
    日期计算
    数列分段
  • 原文地址:https://www.cnblogs.com/0x12345678/p/5847734.html
Copyright © 2011-2022 走看看