dup和dup2函式簡單使用
阿新 • • 發佈:2018-12-01
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了。