C 語言中的 dup2 函式

Jinku Hu 2023年1月30日 2021年2月7日
  1. 在 C 語言中使用 dup2 函式複製檔案描述符的方法
  2. 使用 dup 函式在 C 語言中複製一個檔案描述符
C 語言中的 dup2 函式

本文將介紹幾種在 C 語言中使用 dup2 函式的方法。

在 C 語言中使用 dup2 函式複製檔案描述符的方法

通常在使用 open 系統呼叫開啟檔案後對檔案進行操作。成功後,open 會返回一個與新開啟的檔案相關的新檔案描述符。在基於 Unix 的系統中,作業系統為每個正在執行的程式維護一個開啟的檔案列表,稱為檔案表。每個條目用 int 型別的整數表示。這些整數在這些系統中被稱為檔案描述符,,許多系統呼叫都會把檔案描述符的值作為引數。

每個正在執行的程式在建立程序時,預設有三個開啟的檔案描述符,除非他們選擇明確關閉它們。dup2 函式為給定的檔案描述符建立一個副本,併為其分配一個新的整數。dup2 將一個要克隆的舊檔案描述符作為第一個引數,第二個引數是新檔案描述符的整數。因此,這兩個檔案描述符都指向同一個檔案,可以互換使用。需要注意的是,如果使用者指定一個當前被開啟的檔案所使用的整數作為第二個引數,它將被關閉,然後重新作為克隆的檔案描述符使用。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.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。當我們執行第二個引數為 121dup2 函式呼叫後,就可以使用新的檔案描述符對同一個檔案進行定址。因此,我們呼叫 dprintf 函式,該函式與 printf 函式類似,只是它需要一個額外的檔案描述符引數,指定寫入輸出的目的地。

使用 dup 函式在 C 語言中複製一個檔案描述符

另外,另一個名為 dup 的函式與 dup2 類似,可以克隆檔案描述符。不過,dup 函式只接受一個要複製的檔案描述符引數,並自動返回新建立的檔案描述符。下面的例子演示了 dup 的用法,我們將返回的值儲存在 int 型別中,然後將 dprintf 函式傳遞給檢索到的檔案描述符。請注意,使用者要負責實現這兩個函式的錯誤檢查例程,以驗證是否成功執行。具體細節參見 dup/dup2 手冊頁

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.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);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C File