1、系統調用
系統調用提供的函數如open, close, read, write, ioctl等,需包含標頭檔unistd.h 。以write為例:其函數原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對象為文 件描述符或檔案控制代碼fd(file descriptor),要想寫一個檔案,必須先以可寫入權限用open系統調用開啟一個文 件,獲得所開啟檔案的fd,例如 fd=open(\"/dev/video\", O_RDWR)。fd是一個整型值,每新開啟一 個檔案,所獲得的fd為當前最大fd加1。Linux系統預設分配了3個檔案描述符值:0-standard input,1- standard output,2-standard error。
系統調用通常用於底層檔案訪問(low-level file access) ,例如在驅動程式中對裝置檔案的直接存取。
系統調用是作業系統相關的,因此一般沒有跨作業系統 的可移植性。
系統調用發生在核心空間,因此如果在使用者空間的一般應用程式中使用系統調用來進行 檔案操作,會有使用者空間到核心空間切換的開銷。事實上,即使在使用者空間使用庫函數來對檔案進行操作,因 為檔案總是存在於儲存介質上,因此不管是讀寫操作,都是對硬體(儲存空間)的操作,都必然會引起系統調用 。也就是說,庫函數對檔案的操作實際上是通過系統調用來實現的。例如C庫函數fwrite()就是通過write()系 統調用來實現的。
這樣的話,使用庫函數也有系統調用的開銷,為什麼不直接使用系統調用呢?這是 因為,讀寫檔案通常是大量的資料(這種大量是相對於底層驅動的系統調用所實現的資料操作單位而言),這 時,使用庫函數就可以大大減少系統調用的次數。這一結果又緣於緩衝區技術。在使用者空間和核心空間,對文 件操作都使用了緩衝區,例如用fwrite寫檔案,都是先將內容寫到使用者空間緩衝區,當使用者空間緩衝區滿或者 寫操作結束時,才將使用者緩衝區的內容寫到核心緩衝區,同樣的道理,當核心緩衝區滿或寫結束時才將核心緩 沖區內容寫到檔案對應的硬體媒介。