? ? ? ? 由上小節知道,C庫函數是借助FILE類型的結構體來對文件進行操作的,其本身只是在用戶空間(I/O緩沖區)進行讀寫操作,而數據在內核與用戶空間之間的傳遞、以及將內核與I/O設備之間的數據傳遞都是該C庫函數進行一系列的系統調用來完成的。每一個C庫函數(接口函數,API)對應的是一個或多個系統調用。
? ? ? ? 下圖以printf函數為例。printf是標準輸出流的輸出函數(其文件描述符為1,STDOUT_FILENO),用來向屏幕這樣的標準輸出設備輸出,而fprintf則是向文件輸出,將輸出的內容輸出到硬盤上的文件或是相當于文件的設備上。printf是行緩沖的輸出,fprintf是全緩沖的輸出。
? ? ? ? 由該圖可以看出,C庫函數printf標準輸出的文件描述符為fd,文件讀寫指針為FP_POS,I/O緩沖區為BUFFER,其中存儲了要輸出的內容(hello),這些都保存在FILE結構體中。為了實現將緩沖區的數據送入內核緩沖中,printf函數需要調用write函數,其有三個參數:文件描述符、字符串和字符串長度,從而把文件描述符和輸出的內容傳遞到內核。強調一點:write函數是應用層的函數,處于用戶空間,對用戶空間進行操作。接著,調用函數sys_write( ),該函數完成一個系統調用,位于內核空間,對內核操作,調用相應的設備驅動程序,屬于內核層。最后,設備驅動程序運行,驅動設備完成輸出數據到顯示器的操作,屬于硬件層。這也是由系統調用來完成的。