1. 程式人生 > >【APUE學習筆記】dup和dup2用法

【APUE學習筆記】dup和dup2用法

在瞭解dup用法之前,需要對linux的檔案節點有一個認識。

核心有3個數據結構來表示程序開啟的檔案,dup是系統提供的一個API可以直接操作這三個資料結構之間的關係。

(1)每個程序在程序表當中都有一個記錄項,記錄項中包含一張表格,記錄了所有當前程序開啟的檔案,可以將其想象成為一個key-value的對映關係,key為檔案描述符fd,對於每個程序來說,fd從0開始向後排,value為指向檔案表的一個指標。

(2)檔案表是核心管理開啟檔案的一張表,核心為每個開啟的檔案維持了一個檔案表,包含檔案狀態標識(read, write, append, nonblock)等,當前檔案偏移量和一個指向v-node的指標

(3)v-node包含了檔案型別和對此檔案進行各種操作的函式指標,還有可能包含該檔案的i-node。這些資訊都是在開啟檔案時從硬碟讀入記憶體的。


dup系列函式的本質實際上是對檔案指標的複製,可以順序生成檔案描述符(fd),或者要求在指定描述符上覆制檔案指標(dup2)。上圖事實上就是執行了 newfd = dup(1)以後的核心儲存結構(假設下一個可用的檔案描述符為3)。

#include <unistd.h>
int dup(int fd);
//複製fd對應的檔案表指標,返回下一個可用的檔案描述符
int dup2(int fd1, int fd2);
//將fd2對應的檔案表指標修改為fd1對應的檔案表指標

現在有一個需求是將當前程序所有列印在螢幕上面的資訊列印到一個指定的檔案內,用dup2來實現就很容易了。

#include "apue.h"

int main() {
    int fd = open("test.txt", O_RDWR);
    dup2(fd, STDOUT_FILENO);
    //將1對應的檔案表指標修改為fd對應的檔案表指標
    //後面所有的printf操作都會將資訊列印在 test.txt當中
    

    return 0;
}