檔案描述符和檔案流指針的關系
檔案流指針是标準庫操作句柄:FILE*
檔案描述符是系統調用接口句柄:int fd
檔案流指針中包含了一個成員變量是—檔案描述符
庫函數内部封裝的就是系統調用接口
緩沖區是使用者态的緩沖區,存在于檔案流指針結構體中
一個程序被建立–>預設打開三個檔案
檔案描述符:
每個運作起來的程序 Linux 作業系統都會為其建立一個 task_struct 結構體,稱為程序描述符或程序控制塊(PCB),通過 PCB 管理程序
而在 task_strut 結構體中有一個指針指向了 files_struct 結構體,files_struct 結構體存儲了該程序的各種關于檔案的資訊,其中包括 struct file * fd_array[] 這個數組(稱為檔案描述符表),每打開一個檔案都會建立一個 file 結構體來存放檔案的描述資訊,這個結構體會被放在檔案描述符表中,而檔案描述符就是一個數組下标
通過這個數組下标和這個數組就能找到檔案的描述資訊(struct file 結構體)
檔案描述符配置設定規則:
最小未使用
最小的未使用的下标(從數組開頭尋找未使用的下标,找到就将這個下标作為目前的檔案描述符,是以是最小未使用)
重定向:
> 清空重定向
>> 追加重定向
dup2(fd, 1);
fd 是檔案描述符
将 1 也就是标準輸出檔案重定向到 fd 對應的檔案
該顯示到顯示器上的資料,都會被輸出到 fd 所描述的檔案中
檔案描述符的重定向 – 改變一個描述符對應的檔案描述資訊
改變了檔案描述符對應的檔案描述資訊,這時候對描述符寫入資料,資料就從原本要寫入的檔案,流向了新的檔案
\n
重新整理緩沖區僅僅針對的是标準輸出檔案,對于其他的磁盤檔案并不具備重新整理緩沖區的作用
系統調用因為沒有緩沖區,是以不會執行重新整理緩沖區的動作
minishell的重定向實作:
- 先對指令行的輸入進行字元串解析,擷取到索要執行的程式和參數
- 判斷參數中有重定向符号(> 清空, >> 追加)
- 打開檔案,打開方式不同,清空重定向 --> O_CREATE|O_TRUNC|O_WRONLY,追加重定向 --> O_CREATE|O_APPEND|O_WRONLY
- 檔案描述符重定向:dup2(int oldfd, int newfd) 将 newfd 指向 oldfd 所指向的檔案,将 newfd 下标對應的描述資訊修改為 oldfd 對應的描述資訊,相當于操作的都是 oldfd 所指向的檔案
自主實作 minishell