• dup和dup2函数简单使用


    dup函数

    头文件和函数原型:

    #include <unistd.h>
    int dup(int oldfd);
    

    dup函数是用来打开一个新的文件描述符,指向和oldfd同一个文件,共享文件偏移量和文件状态。

    共享偏移量代码:

    int main(int argc, char const *argv[])
    {
        int fd = open("testDup.txt", O_RDONLY);
        int copyFd = dup(fd);
        //将fd阅读文件置于文件末尾,计算偏移量。
        cout << "fd = " << fd << " 偏移量: " << lseek(fd, 0, SEEK_END) << endl;
        //现在我们计算copyFd的偏移量
        cout << "copyFd = " << copyFd << "偏移量:" << lseek(copyFd, 0, SEEK_CUR) << endl;
        return 0;
    }
    

    执行结果:

    fd = 3 偏移量: 75
    copyFd = 4偏移量:75
    

    返回值

    返回值就是一个新的文件描述符,失败为-1。

    用下图可以描述此函数的作用:

    当我们调用dup(3)的时候,会打开新的最小描述符,也就是4,这个4指向了3所指向的文件,后续操作这两个中任意一个fd都有一样的效果。

    dup2函数

    头文件和函数原型:

    #include <unistd.h>
    int dup2(int oldfd, int newfd);
    

    dup2函数,把指定的newfd也指向oldfd指向的文件,也就是说,执行完dup2之后,有newfd和oldfd同时指向同一个文件,共享文件偏移量和文件状态

    如下图,一开始我们有文件描述符3指向文件A,4指向文件B。

    现在我们执行:

    dup2(3, 4);
    

    也就是我们把4也指向了3所指向的文件。如下图:

    再提供一下证明共享偏移量的代码:

    int main(int argc, char const *argv[])
    {
        int fdOld = open("testDup.txt", O_RDONLY);
        int fdNew;
        fdNew = dup2(fdOld, 14);
        //将fd阅读文件置于文件末尾,计算偏移量。
        cout << "fdOld = " << fdOld << " 偏移量: " << lseek(fdOld, 0, SEEK_END) << endl;
        //现在我们计算copyFd的偏移量
        cout << "fdNew = " << fdNew << "偏移量:" << lseek(fdNew, 0, SEEK_CUR) << endl;
        return 0;
    }
    

    执行结果:

    fdOld = 3 偏移量: 75
    fdNew = 14偏移量:75
    

    返回值

    成功返回newfd,失败返回-1.

    Note

    在我们执行dup2之前,最好手动执行:

    close(newfd);
    

    否则,当系统执行关闭newfd再指向oldfd时,有错误发生,那么就不能成功关闭原来所指向文件B了。

  • 相关阅读:
    说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
    利用CSS3实现页面淡入动画特效
    ajax
    jQuery弹性滑动导航菜单实现思路及代码
    angular 管理后台
    jq简单选项卡
    按钮60秒倒计时
    jq倒计时
    angular ui-route
    flex弹性布局
  • 原文地址:https://www.cnblogs.com/love-jelly-pig/p/10048483.html
Copyright © 2020-2023  润新知