Linux 系統呼叫 dup 和dup2

2021-09-03 00:23:10 字數 1023 閱讀 6759

1、dup()

dup()系統呼叫會建立檔案描述符的乙個拷貝:

(1)新生成的檔案描述符是程序中最小的未使用的檔案描述符,0 、1 、2對應標準輸入、標準輸出、標準錯誤輸出

(2)如果拷貝成功,那麼原始的和拷貝的檔案描述符可能會交叉使用

(3)兩者都指向同乙個開啟的檔案描述符,因此共享檔案偏移量和檔案狀態標誌

語法:

int dup(int oldfd);oldfd:舊的檔案描述符的拷貝被建立
例項如下:

#include#include #include int main() 

2、dup2()

dup2()系統呼叫與dup類似,它們之間的基本不同在於dup2()不使用最小的未使用的檔案描述符編號,它使用指定的檔案描述符編號。

語法:

int dup2(int oldfd, int newfd);oldfd:old file descriptornewfdnew file descriptor which is used by dup2() to create a copy.
關鍵點:

dup()和dup2()系統呼叫都要包含unistd.h標頭檔案

如果newfd描述符之間就開啟了,那麼在重用之前會被關閉

如果oldfd是非法的檔案描述符,則系統呼叫失敗,newfd也不會關閉

如果oldfd是有效的檔案描述符,newfd的值和oldfd的值相同,那麼dup2()什麼都不做,直接返回newfd

使用dup2()系統呼叫的小技巧:

因為newfd可以是任何的檔案描述符,以下的例項使用了c的標準輸出stdout。這能實現把printf語句的輸出寫到oldfd關聯的檔案中:

#include#include#include#includeint main() 

printf的輸出會寫入tricky.txt中

dup與dup2系統呼叫

以下 摘自linux 0.11,雖然 已經過時,但是它的實現非常直觀,簡單,對於理解dup的實現有著很大的價值和幫助。通過這段 很容易理解dup背後的思想。複製檔案控制代碼 描述符 fs fcntl.c 引數fd 是欲複製的檔案控制代碼,arg 指定新檔案控制代碼的最小數值。返回新檔案控制代碼或出錯...

linux系統呼叫dup,dup2,dup3

翻譯自ubuntu下的linux programmer s manual dup,dup2,dup3 複製乙個檔案描述府。include int dup int oldfd int dup2 int oldfd,int newfd define gnu source 見 feature test m...

Linux中dup函式和dup2函式

個人部落格傳送門 linux 中進行檔案描述符的重定向可以使用兩個函式 dup函式和dup2函式,其中還有乙個dup3函式,但是這個是linux後面版本新增的,不是所有的linux核心都支援,在這裡不討論。在linux系統中約定檔案描述符 0 1 2 對應標準輸入 標準輸出 標準錯誤,預設開啟。du...