C 語言中的 dup2 函式
本文將介紹幾種在 C 語言中使用 dup2
函式的方法。
在 C 語言中使用 dup2
函式複製檔案描述符的方法
通常在使用 open
系統呼叫開啟檔案後對檔案進行操作。成功後,open
會返回一個與新開啟的檔案相關的新檔案描述符。在基於 Unix 的系統中,作業系統為每個正在執行的程式維護一個開啟的檔案列表,稱為檔案表。每個條目用 int
型別的整數表示。這些整數在這些系統中被稱為檔案描述符,,許多系統呼叫都會把檔案描述符的值作為引數。
每個正在執行的程式在建立程序時,預設有三個開啟的檔案描述符,除非他們選擇明確關閉它們。dup2
函式為給定的檔案描述符建立一個副本,併為其分配一個新的整數。dup2
將一個要克隆的舊檔案描述符作為第一個引數,第二個引數是新檔案描述符的整數。因此,這兩個檔案描述符都指向同一個檔案,可以互換使用。需要注意的是,如果使用者指定一個當前被開啟的檔案所使用的整數作為第二個引數,它將被關閉,然後重新作為克隆的檔案描述符使用。
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern int counter;
int main(void) {
int fd = open("tmp.txt", O_WRONLY | O_APPEND);
printf("tmp.txt fd = %d\n", fd);
dup2(fd, 121);
dprintf(121, "This string will be printed in tmp.txt file\n");
exit(EXIT_SUCCESS);
}
輸出:
tmp.txt fd = 3
上面的例子演示了 dup2
函式的基本用法,其中一個名為 tmp.txt
的任意檔案在 append
模式下被開啟,一些格式化的文字被寫入其中。預設的檔案描述符是 open
系統呼叫返回的 3
。當我們執行第二個引數為 121
的 dup2
函式呼叫後,就可以使用新的檔案描述符對同一個檔案進行定址。因此,我們呼叫 dprintf
函式,該函式與 printf
函式類似,只是它需要一個額外的檔案描述符引數,指定寫入輸出的目的地。
使用 dup
函式在 C 語言中複製一個檔案描述符
另外,另一個名為 dup
的函式與 dup2
類似,可以克隆檔案描述符。不過,dup
函式只接受一個要複製的檔案描述符引數,並自動返回新建立的檔案描述符。下面的例子演示了 dup
的用法,我們將返回的值儲存在 int
型別中,然後將 dprintf
函式傳遞給檢索到的檔案描述符。請注意,使用者要負責實現這兩個函式的錯誤檢查例程,以驗證是否成功執行。具體細節參見 dup
/dup2
手冊頁。
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern int counter;
int main(void) {
int fd = open("tmp2.txt", O_WRONLY | O_APPEND);
printf("tmp2.txt fd = %d\n", fd);
int dup_fd = dup(fd);
dprintf(dup_fd, "This string will be printed in tmp2.txt file\n");
exit(EXIT_SUCCESS);
}