美文网首页转载部分
函数dup2的理解

函数dup2的理解

作者: Allenkevin | 来源:发表于2017-04-21 19:51 被阅读58次

    看《UNIX环境高级编程》时,看到书中对函数dup和dup2的描述时,总觉得书中对函数dup2有点没说清楚,不知道是我资质太低呢还是......

    函数原型和原文描述

    #include <unistd.h>
    int dup(int fd);
    int dup2(int fd, int fd2);
    

    原文对函数dup的描述比较好理解,这里只说函数dup2,下面这段话是书中的原文:

    对于dup2,可以用fd2参数指定新描述符的值。如果fd2已经打开,则先将其关闭。如若fd等于fd2, 则dup2返回fd2,而不关闭它。否则,fd2的FD_CLOEXEC文件描述符标志就被清楚,这样fd2在进程调用exec时是打开状态。

    问题出在哪里

    疑惑出在这句话:如果fd2已经打开,则先将其关闭。
    关闭什么,应该是关闭fd2和之前文件表项之间的映射关系,然后再让fd2和fd指向同一个文件表项。
    举个例子,我让fd2的值取STDOUT_FILENO,然后使用printf()输出fd2的值,会发生什么

    #include "apue.h"
    #include <fcntl.h>
    #include <unistd.h>
    
    int main(void)
    {
        int fd, temp;
        fd = open("./test.txt", O_RDWR);
        temp = dup2(fd, STDOUT_FILENO);
        printf("fd = %d, temp = %d", fd, temp);
        return 0;
    }
    

    执行后,会发现printf()将内容输出到了文件test.txt里面,而不是输出到了显示器。本来STDOUT_FILENO是作为标准输出和显示器绑定的,现在调用函数dup2,会先解除它们之间的映射关系,然后让STEOUT_FILENO与文件描述符fd指向的文件表项建立映射关系。
    如果用图来看就是这么个关系

    调用函数dup2前 调用函数dup2后

    相关文章

      网友评论

        本文标题:函数dup2的理解

        本文链接:https://www.haomeiwen.com/subject/lhzdzttx.html