linux系統調用和庫函數調用的區別

Linux下對文件操做有兩種方式:系統調用(system call)和庫函數調用(Library functions)。能夠參考《Linux程序設計》(英文原版爲《Beginning Linux Programming》,做者是Neil Matthew和Richard Stones)第三章: Working with files。系統調用實際上就是指最底層的一個調用,在linux程序設計裏面就是底層調用的意思。面向的是硬件。而庫函數調用則面向的是應用開發的,至關於應用程序的api,採用這樣的方式有不少種緣由,第一:雙緩衝技術的實現。第二,可移植性。第三,底層調用自己的一些性能方面的缺陷。第四:讓api也能夠有了級別和專門的工做面向。linux

 

一、系統調用api

系統調用提供的函數如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。ide

系統調用一般用於底層文件訪問(low-level file access),例如在驅動程序中對設備文件的直接訪問。函數

系統調用是操做系統相關的,所以通常沒有跨操做系統的可移植性。性能

系統調用發生在內核空間,所以若是在用戶空間的通常應用程序中使用系統調用來進行文件操做,會有用戶空間到內核空間切換的開銷。事實上,即便在用戶空間使用庫函數來對文件進行操做,由於文件老是存在於存儲介質上,所以無論是讀寫操做,都是對硬件(存儲器)的操做,都必然會引發系統調用。也就是說,庫函數對文件的操做其實是經過系統調用來實現的。例如C庫函數fwrite()就是經過write()系統調用來實現的。spa

這樣的話,使用庫函數也有系統調用的開銷,爲何不直接使用系統調用呢?這是由於,讀寫文件一般是大量的數據(這種大量是相對於底層驅動的系統調用所實現的數據操做單位而言),這時,使用庫函數就能夠大大減小系統調用的次數。這一結果又緣於緩衝區技術。在用戶空間和內核空間,對文件操做都使用了緩衝區,例如用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 *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;
相關文章
相關標籤/搜索