Linux C dup和dup2函式詳解

2021-10-10 01:09:57 字數 1645 閱讀 6912

系統呼叫dup()建立檔案描述符oldfd的乙個副本,使用編號最低的未使用描述符作為新描述符。

成功返回後,新舊檔案描述符可以互換使用。它們引用相同的開啟檔案描述,因此共享檔案偏移量和檔案狀態標誌;

例如,如果在其中乙個描述符上使用lseek(2)修改檔案偏移量,則另乙個描述符的偏移量也會更改。

這兩個描述符不共享檔案描述符標誌(exec關閉標誌)。重複描述符的close on exec標誌(fd_cloexec;

請參見fcntl(2))已關閉。

#include int dup(int oldfd);
#include#include#include#include#define max_buf_len 1024

int main()

int fd2 = dup(oldfd);

if(fd2 < 0 )

char buf[max_buf_len];

int bytes;

/* 將標準輸入寫入buf,這裡的0表示的是標準輸入描述符,定義是 stdin_fileno */

while((bytes = read(0, buf, max_buf_len - 1)) > 0)

printf("read bytes = %d\n", bytes);

/* 將buf中資料寫入fd2,實際寫入oldfd */

if(write(fd2, buf, bytes) < bytes)

memset(buf, 0, max_buf_len);

}if (close(fd2) != 0)

if (close(oldfd) != 0)

return 0;

}

dup2()系統呼叫執行與dup()相同的任務,但它不使用編號最低的未使用檔案描述符,而是使用newfd中指定的描述符編號。如果描述符newfd以前是開啟的,那麼它在被重用之前是靜默關閉的。

關閉和重用檔案描述符newfd的步驟是以原子方式執行的。這一點很重要,因為嘗試使用close(2)和dup()實現等效功能會受到競爭條件的影響,因此newfd可能會在兩個步驟之間重用。這種重用可能是因為主程式被分配檔案描述符的訊號處理程式中斷,或者是因為並行執行緒分配了檔案描述符。

注意以下幾點:

如果oldfd不是有效的檔案描述符,則呼叫失敗,newfd未關閉。

如果oldfd是有效的檔案描述符,並且newfd的值與oldfd相同,那麼dup2()不執行任何操作,並返回newfd。

**示例:

#include #include #include #include #include int main()

fd = dup2(oldfd, fileno(stdout));

if(fd == -1)

system("ifconfig");

if (close(oldfd) != 0)

if (close(fd) != 0)

return 0;

}

system函式執行過程中,將標準輸出重定向到oldfd中,程式執行完會生成ifconfig.txt檔案,內容如下:

Linux 系統呼叫 dup 和dup2

1 dup dup 系統呼叫會建立檔案描述符的乙個拷貝 1 新生成的檔案描述符是程序中最小的未使用的檔案描述符,0 1 2對應標準輸入 標準輸出 標準錯誤輸出 2 如果拷貝成功,那麼原始的和拷貝的檔案描述符可能會交叉使用 3 兩者都指向同乙個開啟的檔案描述符,因此共享檔案偏移量和檔案狀態標誌 語法 ...

dup與dup2系統呼叫

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

dup和dup2的使用方法

本文通過標準輸出的重定向和恢復的過程來解釋dup和dup2的使用方法 include include include stdin fileno標準輸入描述符 0 stdout fileno標準輸出描述符 1 stderr fileno標準錯誤描述符 2 int main void s fd dup ...