1. 程式人生 > >3.1 Linux中的檔案IO (11、12節)

3.1 Linux中的檔案IO (11、12節)

3.1.11.檔案描述符的複製1

3.1.11.1、dup和dup2函式介紹

3.1.11.2、使用dup進行檔案描述符複製

(1)dup系統呼叫對fd進行復制,會返回一個新的檔案描述符(譬如原來的fd是3,返回的就是4)
(2)dup系統呼叫有一個特點,就是自己不能指定複製後得到的fd的數字是多少,而是由作業系統內部自動分配的,分配的原則遵守fd分配的原則。
(3)dup返回的fd和原來的oldfd都指向oldfd開啟的那個動態檔案,操作這兩個fd實際操作的都是oldfd開啟的那個檔案。實際上構成了檔案共享。
(4)dup返回的fd和原來的oldfd同時向一個檔案寫入時,結果是分別寫還是接續寫?

3.1.11.3、使用dup的缺陷分析

(1)dup並不能指定分配的新的檔案描述符的數字,dup2系統呼叫修復了這個缺陷,所以平時專案中實際使用時根據具體情況來決定用dup還是dup2.
3.1.11.4、練習
(1)之前課程講過0、1、2這三個fd被標準輸入、輸出、錯誤通道佔用。而且我們可以關閉這三個
(2)我們可以close(1)關閉標準輸出,關閉後我們printf輸出到標準輸出的內容就看不到了
(3)然後我們可以使用dup重新分配得到1這個fd,這時候就把oldfd開啟的這個檔案和我們1這個標準輸出通道給繫結起來了。這就叫標準輸出的重定位。
(4)可以看出,我們可以使用close和dup配合進行檔案的重定位。

3.1.12.檔案描述符的複製2

3.1.12.1、使用dup2進行檔案描述符複製
(1)dup2和dup的作用是一樣的,都是複製一個新的檔案描述符。但是dup2允許使用者指定新的檔案描述符的數字。
(2)使用方法看man手冊函式原型即可。

3.1.12.2、dup2共享檔案交叉寫入測試

(1)dup2複製的檔案描述符,和原來的檔案描述符雖然數字不一樣,但是這連個指向同一個開啟的檔案
(2)交叉寫入的時候,結果是接續寫(實驗證明的)。

3.1.12.3、命令列中重定位命令 >

(1)linux中的shell命令執行後,列印結果都是預設進入stdout的(本質上是因為這些命令譬如ls、pwd等都是呼叫printf進行列印的),所以我們可以在linux的終端shell中直接看到命令執行的結果。
(2)能否想辦法把ls、pwd等命令的輸出給重定位到一個檔案中(譬如2.txt)去,實際上linux終端支援一個重定位的符號>很簡單可以做到這點。
(3)這個>的實現原理,其實就是利用open+close+dup,open開啟一個檔案2.txt,然後close關閉stdout,然後dup將1和2.txt檔案關聯起來即可。