系統呼叫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 ...