Linux下開發-dup和dup2

啊浪的部落格發表於2017-11-04

dupdup2都可用來複制一個現存的檔案描述符,使兩個檔案描述符指向同一個file結構體。如果兩個檔案描述符指向同一個file結構體,File Status Flag和讀寫位置只儲存一份在file結構體中,並且file結構體的引用計數是2


如果兩次open同一檔案得到兩個檔案描述符,則每個描述符對應一個不同的file結構體,可以有不同的FileStatus Flag和讀寫位置。




#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);


如果呼叫成功,這兩個函式都返回新分配或指定的檔案描述符,如果出錯則返回-1。

dup返回的新檔案描述符,是程式未使用的最小檔案描述符,這一點和open類似。

dup2可以用newfd引數指定新描述符的數值。如果newfd當前已經開啟,則先將其關閉再做dup2操作,如果oldfd等於newfd,則dup2直接返回newfd而不用先關閉newfd再複製。

 

int  dup(int oldfd);

dup()用來複制引數oldfd所指的檔案描述詞,並將它返回。此新的檔案描述詞和引數oldfd指的是同一個檔案,共享所有的鎖定、讀寫位置和各項許可權或旗標。例如,當利用lseek()對某個檔案描述詞作用時,另一個檔案描述詞的讀寫位置也會隨著改變。不過,檔案描述詞之間並不共享close-on-exec旗標(http://www.tuicool.com/articles/FvIjMv

當複製成功時,則返回最小及尚未使用的檔案描述詞。若有錯誤則返回-1,errno會存放錯誤程式碼。


int  dup2(int oldfd, int newfd);

dup2()用來複製引數oldfd所指的檔案描述詞,並將它拷貝至引數newfd後一塊返回。若引數newfd為一個已開啟的檔案描述詞,則newfd所指的檔案會先被關閉。dup2()所複製的檔案描述詞,與原來的檔案描述詞共享各種檔案狀態。

當複製成功時,則返回最小及尚未使用的檔案描述詞。若有錯誤則返回-1,errno會存放錯誤程式碼。




相關文章