系統呼叫 函式呼叫

2021-08-11 21:36:57 字數 1720 閱讀 8430

linux下對檔案操作有兩種方式:

提供了庫函式,如open(), close(), read(), write(), ioctl()等,需包含標頭檔案unistd.h。

以write()函式為例:其函式原型為size_t write(int fd, const void *buf, size_t nbytes),其操作物件為檔案控制代碼fd(file descriptor).(檔案描述符)

寫乙個檔案,要用系統呼叫open()以可寫許可權開啟檔案,獲得檔案的 fd。

例如

if ( (fd=open("/dev/ttys0", o_rdwr < 0)

//o_rdwr --> 以讀寫方式開啟

這是檔案i/o的常用函式,用來開啟乙個裝置,返回乙個整型變數。如果返回值等於-1,說明開啟檔案時出現錯誤,如果為大於0的值,這個值就是檔案描述符。

每新開啟乙個檔案,所獲得的fd為當前最大fd加1。linux系統預設分配了3個檔案描述符值:0–standard input,1–standard output,2–standard error.

系統呼叫通常用於對底層檔案的訪問(low-level file access)。例如在驅動程式中對裝置檔案的直接訪問。

系統呼叫關係到作業系統,因此一般不具有跨作業系統的可移植性。

系統呼叫發生在核心空間,因此如果在使用者空間的一般應用程式中使用系統呼叫進行檔案操作,會有使用者空間到核心空間切換的開銷。事實上,即使在使用者空間使用庫函式來對檔案進行操作,由於檔案總是存在於儲存介質上,因此不管是讀還是寫操作,都是對硬體(儲存器)的操作,必然會引起系統呼叫。

也就是說,庫函式對檔案的操作實際上是通過系統呼叫來實現的。例如c庫函式fwrite()就是通過write()系統呼叫來實現的。

這樣的話,使用庫函式也有系統呼叫的開銷,為什麼不直接使用系統呼叫呢?這是因為,讀寫檔案通常是大量的資料(這種大量是相對於底層驅動的系統呼叫所實現的資料操作單位而言),這時,使用庫函式就可以大大減少系統呼叫的次數。

這一結果又緣於緩衝區技術。在使用者空間和核心空間,對檔案操作都使用了緩衝區。例如用fwrite寫檔案,都是先將內容寫到使用者空間緩衝區,當使用者空間緩衝區滿或者寫操作結束時,才將使用者緩衝區的內容寫到核心緩衝區;同樣的道理,當核心緩衝區滿或寫結束時才將核心緩衝區內容寫到檔案對應的硬體媒介。

標準c庫提供的檔案操作函式,如fopen, fread, fwrite, fclose, fflush, fseek等,需包含標頭檔案stdio.h。

以fwrite為例,其函式原型為

size_t fwrite(const

void *buffer, size_t size, size_t item_num, file *fp)

其操作物件為檔案指標pf,寫乙個檔案時要用fopen函式以可寫許可權開啟乙個檔案,獲得所開啟檔案的file結構指標pf,例如

fp = fopen(「~/proj/filename」, 「w」) //以寫方式開啟檔案
由於庫函式對檔案的操作最終是通過系統呼叫實現的,因此每開啟乙個檔案所獲得的file結構指標都有乙個核心空間的檔案描述符fd與之對應。

同樣有相應的預定義的file指標:stdin-standard input,stdout-standard output,stderr-standard error.

系統呼叫函式

1.位元組順序和轉換函式 先來了解乙個概念 大端模式和小端模式 大端模式是指高位元組資料存放在低位址處,低位元組資料存放在高位址處.小端模式是指低位元組資料放在記憶體的記憶體低位址處,高位元組資料存放在記憶體的高位址處 在網路上傳輸資料時,由於資料傳輸的兩端可能對應不同的硬體平台,採用的儲存位元組的...

系統呼叫與庫函式呼叫

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...

Linux系統呼叫和庫函式呼叫

linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 可以參考 linux程式設計 英文原版為 beginning linux programming 作者是neil matthew和richard stones 第三章 working...