一、系統調用
系統調用
,我們可以理解是操作系統爲用戶提供的一系列操作的接口(API),這些接口提供了對系統硬件設備
功能的操作。
系統調用是操作系統的一個入口點,在內核地址空間執行,需要在用戶空間和內核上下文環境間切換,開銷較大。
系統中的各種共享資源都由操作系統統一掌管,在用戶程序中,凡是與硬件資源有關的操作(如存儲分配、進行I/0傳輸以及管理文件等),都必須通過系統調用方式向操作系統提出服務請求,並由操作系統代爲完成。
二、標準庫函數調用
庫函數可以理解爲是對系統調用的一層封裝。
函數庫調用
與用戶程序相聯繫,在用戶地址空間執行,屬於過程調用,調用開銷較小。
庫函數調用面向的是應用開發的,相當於應用程序的api,採用這樣的方式有很多種原因:
第一:雙緩衝技術的實現。第二,可移植性。第三,底層調用本身的一些性能方面的缺陷。第四:讓api也可以有了級別和專門的工作面向。
三、 系統調用與標準庫函數調用區別
系統調用發生在內核空間,因此如果在用戶空間的一般應用程序中使用系統調用來進行文件操作,會有用戶空間到內核空間切換的開銷,因此開銷較大。
事實上,即使在用戶空間
使用庫函數
來對文件進行操作,因爲文件總是存在於存儲介質上,因此不管是讀寫操作,都是對硬件(存儲器)的操作,都必然會引起系統調用
。
也就是說,庫函數對文件的操作實際上是通過系統調用來實現的。例如C庫函數fwrite()就是通過write()系統調用來實現的,因此使用庫函數也有系統調用的開銷
。
爲什麼不直接使用系統調用呢?
因爲讀寫文件通常是大量的數據(相對於底層驅動的系統調用所實現的數據操作單位),這時,使用庫函數可以大大減少系統調用的次數。
因爲緩衝區技術
,在用戶空間和內核空間對文件操作都使用了緩衝區。當用戶空間緩衝區滿或者寫操作結束時,纔將用戶緩衝區的內容寫到內核緩存區。同理,內核緩衝區滿或寫結束時,纔將內核緩衝區內容寫到文件對應的硬件媒介。
系統調用
系統調用函數:open, close, read, write, ioctl等,需要包含頭文件unistd.h;
系統調用通常用於底層文件訪問,例如在驅動程序中對設備文件的直接訪問;
系統調用是操作系統相關的,因此一般沒有跨操作系統的可移植性。
標準庫函數調用
標準庫調用函數:fopen, fread, fwrite, fclose, fflush, fseek等,需要包含頭文件stdio.h
標準庫函數調用通常用於應用程序中對一般文件的訪問。
標準庫函數調用是系統無關的,因此可移植性好。
由於標準庫函數調用是基於C庫的,因此不可能用於內核空間
的驅動程序中對設備
的操作。
詳細可參考如下表格
參考:
https://blog.csdn.net/u010318270/article/details/81058065
https://blog.csdn.net/sz_bb/article/details/51337007