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),例如在驅動程序中對設備文件的直接訪問。 系統調用是操作系統相關的,因此一般沒有跨操作系統的可移植性。
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庫的,因此也就不可能用于內核空間的驅動程序中對設備的操作
總結:
應用程序可以調用系統調用,或者庫函數,而很多庫函數則會調用系統調用。
另一個系統調用和庫函數之間的差別是:系統調用通常提供一種最小界面,而庫函數通常提供比較復雜的功能。
更多關于物聯網培訓的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓服務經驗,采用全程面授高品質、高體驗培養模式,擁有國內一體化教學管理及學員服務,助力更多學員實現高薪夢想。