天天看點

檔案描述符&&檔案流指針

檔案描述符和檔案流指針的關系

檔案流指針是标準庫操作句柄: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的重定向實作:

  1. 先對指令行的輸入進行字元串解析,擷取到索要執行的程式和參數
  2. 判斷參數中有重定向符号(> 清空, >> 追加)
  3. 打開檔案,打開方式不同,清空重定向 --> O_CREATE|O_TRUNC|O_WRONLY,追加重定向 --> O_CREATE|O_APPEND|O_WRONLY
  4. 檔案描述符重定向:dup2(int oldfd, int newfd) 将 newfd 指向 oldfd 所指向的檔案,将 newfd 下标對應的描述資訊修改為 oldfd 對應的描述資訊,相當于操作的都是 oldfd 所指向的檔案

自主實作 minishell

繼續閱讀