1、系統(tǒng)調(diào)用提供的函數(shù)如open, close, read, write, ioctl等,需包含頭文件unistd.h。
以write為例:其函數(shù)原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對(duì)象為文件描述符或文件句柄fd(file descriptor),要想寫一個(gè)文件,必須先以可寫權(quán)限用open系統(tǒng)調(diào)用打開一個(gè)文件,獲得所打開文件的fd,例如 fd=open(/"/dev/video/", O_RDWR)。fd是一個(gè)整型值,每新打開一個(gè)文件,所獲得的fd為當(dāng)前最大fd加1。
Linux系統(tǒng)默認(rèn)分配了3個(gè)文件描述符值:0-standard input,1-standard output,2-standard error。
系統(tǒng)調(diào)用通常用于底層文件訪問(low-level file access),例如在驅(qū)動(dòng)程序中對(duì)設(shè)備文件的直接訪問。 系統(tǒng)調(diào)用是操作系統(tǒng)相關(guān)的,因此一般沒有跨操作系統(tǒng)的可移植性。
2、標(biāo)準(zhǔn)C庫(kù)函數(shù)提供的文件操作函數(shù)如fopen, fread, fwrite, fclose, fflush, fseek等,需包含頭文件stdio.h。
以fwrite為例,其函數(shù)原型為size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作對(duì)象為文件指針FILE *pf,要想寫一個(gè)文件,必須先以可寫權(quán)限用fopen函數(shù)打開一個(gè)文件,獲得所打開文件的FILE結(jié)構(gòu)指針pf,例如pf=fopen(/"~/proj/filename/", /“w/”)。實(shí)際上,由于庫(kù)函數(shù)對(duì)文件的操作最終是通過系統(tǒng)調(diào)用實(shí)現(xiàn)的,因此,每打開一個(gè)文件所獲得的FILE結(jié)構(gòu)指針都有一個(gè)內(nèi)核空間的文件描述符fd與之對(duì)應(yīng)。
同樣有相應(yīng)的預(yù)定義的FILE指針:stdin-standard input,stdout-standard output,stderr-standard error。
庫(kù)函數(shù)調(diào)用通常用于應(yīng)用程序中對(duì)一般文件的訪問。 庫(kù)函數(shù)調(diào)用是系統(tǒng)無關(guān)的,因此可移植性好。 由于庫(kù)函數(shù)調(diào)用是基于C庫(kù)的,因此也就不可能用于內(nèi)核空間的驅(qū)動(dòng)程序中對(duì)設(shè)備的操作
總結(jié):
應(yīng)用程序可以調(diào)用系統(tǒng)調(diào)用,或者庫(kù)函數(shù),而很多庫(kù)函數(shù)則會(huì)調(diào)用系統(tǒng)調(diào)用。
另一個(gè)系統(tǒng)調(diào)用和庫(kù)函數(shù)之間的差別是:系統(tǒng)調(diào)用通常提供一種最小界面,而庫(kù)函數(shù)通常提供比較復(fù)雜的功能。
更多關(guān)于物聯(lián)網(wǎng)培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓(xùn)服務(wù)經(jīng)驗(yàn),采用全程面授高品質(zhì)、高體驗(yàn)培養(yǎng)模式,擁有國(guó)內(nèi)一體化教學(xué)管理及學(xué)員服務(wù),助力更多學(xué)員實(shí)現(xiàn)高薪夢(mèng)想。