高階I O模型 2 dup dup2

2021-10-07 22:10:11 字數 1884 閱讀 3592

dup和dup2是兩個非常有用的呼叫,它們的作用都是用來複製乙個檔案的描述符。它們經常用來重定向程序的stdin、stdout和stderr。

這兩個函式的原形如下:

利用函式dup,我們可以複製乙個描述符。

傳給該函式乙個既有的描述符,它就會返回乙個新的描述符,這個新的描述符是傳給它的描述符的拷貝。這意味著,這兩個描述符共享同乙個資料結構。

下面是用來說明dup函式使用方法的**片段:

int fd1, fd2;

...fd2 = dup( fd1 );

下面簡單介紹乙個的示例**:

//在檔案log裡列印十次hello world

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

close(1);

fd = dup(fd);

int count = 0;

while(count++ < 10)

close(fd);

return 0;

}

執行結果:

執行結果:

需要注意的是,我們可以在呼叫fork之前建立乙個描述符,這與呼叫dup建立描述符的效果是一樣的,子程序也同樣會收到乙個複製出來的描述符。

dup2函式跟dup函式相似,但dup2函式允許呼叫者規定乙個有效描述符和目標描述符的id。

dup2函式成功返回時,目標描述符(dup2函式的第二個引數)將變成源描述符(dup2函式的第乙個引數)的複製品,換句話說,兩個檔案描述符現在都指向同乙個檔案,並且是函式第乙個引數指向的檔案。

下面我們用一段**加以說明:

int  oldfd;

oldfd = open("./log",(o_wronly | o_create), 0644 );

dup2( oldfd, 1 );

close( oldfd );

本例中,我們開啟了乙個當前目錄下的乙個新檔案,稱為「log」,並收到乙個檔案描述符,該描述符叫做fd1。

我們呼叫dup2函式,引數為oldfd和1,這會導致用我們新開啟的檔案描述符替換掉由1代表的檔案描述符(即stdout,因為標準輸出檔案的id為1)。

任何寫到stdout的東西,現在都將改為寫入名為「log」的檔案中。

下面簡單介紹乙個的示例**:

//在檔案log裡列印十次hello world

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

close(1);

int ret = dup2(fd, 1);

int count = 0;

while(count++ < 10)

close(fd);

return 0;

}

執行結果:

需要注意的是,dup2函式在複製了oldfd之後,會立即將其關閉,但不會關掉新近開啟的檔案描述符,因為檔案描述符1現在也指向它。

linux中dup dup2 的學習總結

1 要了解dup dup2 的使用先要了解檔案描述符。檔案描述符是非負整數,是檔案的標識。使用者使用檔案描述符 file descriptor 來訪問檔案。每個程序都有一張檔案描述符的表,程序剛被建立時,標準輸入 標準輸出 標準錯誤輸出裝置檔案被開啟,對應的檔案描述符0 1 2 記錄在表中。在程序中...

linux系統呼叫dup,dup2,dup3

翻譯自ubuntu下的linux programmer s manual dup,dup2,dup3 複製乙個檔案描述府。include int dup int oldfd int dup2 int oldfd,int newfd define gnu source 見 feature test m...

輸入輸出重定向 dup dup2

輸入重定向 將檔案匯入指定命令中 輸出重定向 將原本輸出開啟螢幕上資料資訊寫入到檔案當中 標準輸入重定向 stdin,檔案描述符為0 預設從鍵盤輸入,也可以從其他檔案或者命令中輸入 標準輸出重定向 stdout,檔案描述符為1 預設輸出到螢幕 標準輸出重定向符號 1 將標準輸出重定向到指定檔案中 清...