目錄
一、文件fd的分配規則
二、對輸出重定向現象的理解
三、輸出輸入重定向的簡單實現
1、輸出重定向
?2、輸入重定向
一、文件fd的分配規則
最小的沒有被使用的數組下標,會被分配給最新打開的文件。
二、對輸出重定向現象的理解
?????????正如上面這段代碼所示,printf打印的內容并沒有向顯示器上打,而是輸出到了log1.txt文件里面,這又是為什么呢?原因就是在該進程的文件描述符表中,原來的下標1位置存的是顯示器文件的地址,你使用系統調用接口close(1),相當于把1位置的內容清空了,也就是1位置不再存儲顯示器文件的地址,后來你又打開了log1.txt文件,操作系統檢測到你這個進程的文件描述符表中最小的沒有被使用的數組下標為1,所以就把log1.txt文件的地址填入了1位置,這是在操作系統層面上做的工作。而在上層的語言層面上,stdout這個文件的文件描述符仍然為1,而且printf函數只認stdout這個文件,只會往stdout這個文件進行寫入,stdout文件通過它的文件描述符在底層的文件描述符表中進行查找的時候找到1位置,而此時1位置所存放的地址已經悄悄地被改成了log1.txt文件的地址,所以printf函數的內容自然就寫到了log1.txt文件中了。這就是輸出重定向。下面是圖解:
?????????但上面這一段代碼有一個小細節需要注意,就是你在進程結束之前不能關閉該文件。如果在進程結束之前關閉該文件,語言層面的緩沖區的內容還來不及刷新到文件中文件描述符中1位置的地址就被清空了,最后進程退出要刷新緩沖區的內容時會因為找不到文件的地址而寫不到文件當中。正如下面代碼和結果所示:
三、輸出輸入重定向的簡單實現
????????命令行解析>符號的時候,把>符號解析成重定向,然后在底層完成重定向的工作,變相地向文件中進行寫入。下面我用dup2()這個系統調用接口實現一下輸出重定向和輸入重定向。?????????dup2()這個接口是指在文件描述符中將newfd位置的地址改成oldfd位置的地址,具體實現如下所示:
1、輸出重定向
????????fd位置的文件地址覆蓋了原本1位置上的文件地址,結果就將本來應該打印到屏幕上的一串hhh字符最終輸入到了指定文件當中。
?2、輸入重定向
????????fd位置的文件地址覆蓋了原本0位置上的文件地址,本來應該從鍵盤中讀到的內容最終從文件中讀到了。