1. 程式人生 > >dup和dup2函式簡單使用

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了。