linux
下對檔案操作有兩種方式:系統呼叫(system call)和庫函式呼叫
(library functions)
。系統呼叫實際上就是指最底層的乙個呼叫,在
linux
程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的
api,
採用這樣的方式有很多種原因,第一:雙緩衝技術的實現。第二,可移植性。第三,底層呼叫本身的一些效能方面的缺陷。第四:讓
api也可以有了級別和專門的工作面向。
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。
庫函式呼叫通常用於應用程式中對一般檔案的訪問。
庫函式呼叫是系統無關的,因此可移植性好。由於庫函式呼叫是基於c庫的,因此也就不可能用於核心空間的驅動程式中對裝置的操作。
系統呼叫與庫函式呼叫的區別
1 系統呼叫和庫函式的關係 系統呼叫通過軟中斷int 0x80從使用者態進入核心態。函式庫中的某些函式呼叫了系統呼叫。函式庫中的函式可以沒有呼叫系統呼叫,也可以呼叫多個系統呼叫。程式設計人員可以通過函式庫呼叫系統呼叫。高階程式設計也可以直接採用int 0x80進入系統呼叫,而不必通過函式庫作為中介。...
系統呼叫與庫函式呼叫的區別
1 系統呼叫和庫函式的關係 系統呼叫通過軟中斷int 0x80從使用者態進入核心態。函式庫中的某些函式呼叫了系統呼叫。函式庫中的函式可以沒有呼叫系統呼叫,也可以呼叫多個系統呼叫。程式設計人員可以通過函式庫呼叫系統呼叫。高階程式設計也可以直接採用int 0x80進入系統呼叫,而不必通過函式庫作為中介。...
庫函式呼叫與系統呼叫的區別
linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...