嵌入式Linux應(yīng)用程序開發(fā)中的文件IO編程
一、Linux系統(tǒng)調(diào)用及API 1. 系統(tǒng)調(diào)用: Linux分為內(nèi)核空間和用戶空間,用戶空間無法直接訪問內(nèi)核空間。內(nèi)核通過系統(tǒng)調(diào)用為用戶提供服務(wù),大約有250個(gè)左右的系統(tǒng)調(diào)用,可以分為進(jìn)程控制、進(jìn)
一、Linux系統(tǒng)調(diào)用及API
1. 系統(tǒng)調(diào)用:
Linux分為內(nèi)核空間和用戶空間,用戶空間無法直接訪問內(nèi)核空間。內(nèi)核通過系統(tǒng)調(diào)用為用戶提供服務(wù),大約有250個(gè)左右的系統(tǒng)調(diào)用,可以分為進(jìn)程控制、進(jìn)程間通信、文件系統(tǒng)控制、系統(tǒng)控制、存儲(chǔ)管理、網(wǎng)絡(luò)管理、socket控制、用戶管理等幾類。
2. C庫API:
C庫提供了一些API,遵循一定的標(biāo)準(zhǔn),供用戶使用。用戶可以直接調(diào)用系統(tǒng)調(diào)用,也可以調(diào)用C庫提供的API。
二、Linux中文件及文件描述符概述
Linux主要有四種文件類型:普通文件、目錄文件、鏈接文件和設(shè)備文件。在Linux中,使用文件描述符操作文件,尤其對于用戶態(tài)來說更是如此。文件描述符是一個(gè)非負(fù)的整數(shù),是個(gè)索引值,在打開文件時(shí)動(dòng)態(tài)分配,優(yōu)先分配未使用的最小描述符。進(jìn)程打開時(shí),默認(rèn)會(huì)打開三個(gè)文件描述符,分別指向標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。
三、底層文件IO操作
3.1 基本文件操作
3.1.1 函數(shù)說明:
有五個(gè)基本函數(shù),不帶緩沖,屬于POSIX標(biāo)準(zhǔn),包括open、read、write、lseek和close。
3.2 文件鎖
3.2.1 共享問題:
多個(gè)進(jìn)程操作同一個(gè)文件時(shí),可能會(huì)造成數(shù)據(jù)混亂的情況。為了解決這個(gè)問題,引入了記錄鎖,實(shí)現(xiàn)對文件的獨(dú)占操作。
3.2.2 fcntl()函數(shù):
當(dāng)多個(gè)進(jìn)程操作同一文件時(shí),應(yīng)該上鎖以保證數(shù)據(jù)的完整性。在進(jìn)程信息中存放了鎖的信息,關(guān)閉進(jìn)程或者關(guān)閉文件時(shí),該文件的鎖會(huì)自動(dòng)關(guān)閉。使用F_SETLK來設(shè)置鎖,并根據(jù)返回值判斷是否設(shè)置成功。
3.3 多路復(fù)用
3.3.1 IO模型:
阻塞IO會(huì)導(dǎo)致進(jìn)程掛起,直到相關(guān)數(shù)據(jù)到達(dá)后才返回。非阻塞IO則不會(huì)等待數(shù)據(jù)到達(dá)而是立即返回,通過輪詢各IO,超時(shí)等待的方式處理IO操作。select和poll就屬于此類信號(hào)驅(qū)動(dòng)IO。
3.3.2 select函數(shù):
select函數(shù)用于對文件描述符進(jìn)行分類處理,需要使用一些宏定義來清除、添加和判斷文件描述符集中的文件描述符。