linux下對檔案操作有兩種方式:系統呼叫(system call)和庫函式呼叫(library functions)。
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寫檔案,都是先將內容寫到使用者空間緩衝區,當使用者空間緩衝區滿或者寫操作結束時,才將使用者緩衝區的內容寫到核心緩衝區,同樣的道理,當核心緩衝區滿或寫結束時才將核心緩衝區內容寫到檔案對應的硬體媒介。
2、庫函式呼叫
標準c庫函式提供的檔案操作函式如fopen, fread, fwrite, fclose, fflush, fseek等,需包含標頭檔案stdio.h。以fwrite為例,其函式原型為size_t fwrite(const void *buffer, size_t size, size_t item_num, file *pf),其操作物件為檔案指標file *pf,要想寫乙個檔案,必須先以可寫許可權用fopen函式開啟乙個檔案,獲得所開啟檔案的file結構指標pf,例如pf=fopen(\"~/proj/filename\", \"w\")。實際上,由於庫函式對檔案的操作最終是通過系統呼叫實現的,因此,每開啟乙個檔案所獲得的file結構指標都有乙個核心空間的檔案描述符fd與之對應。同樣有相應的預定義的file指標:stdin-standard input,stdout-standard output,stderr-standard error。
庫函式呼叫通常用於應用程式中對一般檔案的訪問。
庫函式呼叫是系統無關的,因此可移植性好。
由於庫函式呼叫是基於c庫的,因此也就不可能用於核心空間的驅動程式中對裝置的操作。
庫函式不受編譯器的控制
※函式庫呼叫 vs 系統呼叫
函式庫呼叫
系統呼叫
在所有的ansi c編譯器版本中,c庫函式是相同的
各個作業系統的系統呼叫是不同的
它呼叫函式庫中的一段程式(或函式)
它呼叫系統核心的服務
與使用者程式相聯絡
是作業系統的乙個入口點
在使用者位址空間執行
在核心位址空間執行
它的執行時間屬於「使用者時間」
它的執行時間屬於「系統」時間
屬於過程呼叫,呼叫開銷較小
需要在使用者空間和核心上下文環境間切換,開銷較大
在c函式庫libc中有大約300個函式
在unix中大約有90個系統呼叫
典型的c函式庫呼叫:system fprintf malloc
典型的系統呼叫:chdir fork write brk;
系統呼叫和庫函式
unix 環境高階程式設計 一書中如此說 所有作業系統都提供多種服務的入口點,由此程式向系統核請求服務。各種版本的unix都 提供經良好定義的有限數目的入口點,經過這些入口點進入系統核,這些入口點被稱之為 系統呼叫 system call 系統呼叫是我們不能更改的一種unix特徵。unix版本7提供...
系統呼叫和庫函式
在計算機中,系統呼叫 英語 system call 又稱為系統呼叫,指執行在使用者空間的程式向作業系統核心請求需要更高許可權執行的服務。系統呼叫提供了使用者程式與作業系統之間的介面。大多數系統互動式操作需求在核心態執行。如裝置io操作或者程序間通訊。庫函式是在系統呼叫上的一層包裝,執行在使用者態 u...
系統呼叫和庫函式
系統呼叫概述 系統呼叫,我們可以理解是作業系統為使用者提供的一系列操作的介面 api 這些介面提供了對系統硬體裝置功能的操作。這麼說可能會比較抽象,舉個例子,我們最熟悉的 hello world 程式會在螢幕上列印出資訊。程式中呼叫了 printf 函式,而庫函式 printf 本質上是呼叫了系統呼...