應(yīng)用程序開(kāi)發(fā)方式

在Linux下開(kāi)發(fā)應(yīng)用程序可以調(diào)用兩種接口來(lái)實(shí)現(xiàn),一種是直接調(diào)用系統(tǒng)調(diào)用接口,另一種是調(diào)用庫(kù)函數(shù)來(lái)實(shí)現(xiàn)。
1、什么是系統(tǒng)調(diào)用?
系統(tǒng)調(diào)用(System Call)是操作系統(tǒng)提供的服務(wù),是應(yīng)用程序與內(nèi)核通信的接口。
Linux提供的系統(tǒng)調(diào)用包含的內(nèi)容有:文件操作、進(jìn)程控制、系統(tǒng)控制、內(nèi)存管理、網(wǎng)絡(luò)管理、socket套接字、進(jìn)程間通信、用戶管理等。




相對(duì)于普通的函數(shù)調(diào)用來(lái)說(shuō), 系統(tǒng)調(diào)用的性能消耗也是巨大的。所以在追求極致性能的程序中, 都在盡力避免系統(tǒng)調(diào)用。
2、C庫(kù)函數(shù)
C標(biāo)準(zhǔn)庫(kù)頭文件如下:

Linux環(huán)境下, 使用的C庫(kù)一般都是glibc, 它封裝了幾乎所有的系統(tǒng)調(diào)用, 代碼中使用的“系統(tǒng)調(diào)用”, 實(shí)際上就是調(diào)用C庫(kù)中的函數(shù)。
因?yàn)镃庫(kù)函數(shù)通過(guò)系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn),庫(kù)函數(shù)對(duì)上層提供了C庫(kù)接口。比如文件操作:

實(shí)例:文件操作
Linux下文件操作應(yīng)用程序結(jié)構(gòu)如下:

(圖片來(lái)源:野火Linux開(kāi)發(fā)實(shí)戰(zhàn)指南)
Linux下,“一切皆文件”。為了使不同的文件系統(tǒng)共存, Linux 內(nèi)核在用戶層與具體文件系統(tǒng)之前增加了虛擬文件系統(tǒng)(VFS)中間層,它對(duì)復(fù)雜的系統(tǒng)進(jìn)行抽象化,對(duì)用戶提供了統(tǒng)一的文件操作接口。
1、文件操作:系統(tǒng)調(diào)用
(1)實(shí)操
代碼:
左右滑動(dòng)查看全部代碼>>>
/*文件操作:系統(tǒng)調(diào)用*/ #include
運(yùn)行結(jié)果:

(2)接口說(shuō)明
open函數(shù):

? pathname:要打開(kāi)或創(chuàng)建的文件名;
? flag:指定文件的打開(kāi)方式,具體有以下參數(shù),見(jiàn)下表 flag 參數(shù)值。

? mode:當(dāng) open 函數(shù)的 flag 值設(shè)置為 O_CREAT 時(shí),必須使用 mode 參數(shù)來(lái)設(shè)置文件與用戶相關(guān)的權(quán)限。mode 可用的權(quán)限如下表所示,表中各個(gè)參數(shù)可使用” | “來(lái)組合。

read函數(shù):

? fd:文件對(duì)應(yīng)的文件描述符 ;
? buf:指向數(shù)據(jù)緩沖區(qū)的指針;
? count:讀取多少個(gè)字節(jié)的數(shù)據(jù)。
write函數(shù):

? fd:文件對(duì)應(yīng)的文件描述符;
? buf:指向數(shù)據(jù)緩沖區(qū)的指針;
? count:往文件中寫(xiě)入多少個(gè)字節(jié)。
close函數(shù):

關(guān)閉 fd 文件描述符對(duì)應(yīng)的文件。
lseek 函數(shù):

lseek 函數(shù)可以用與設(shè)置文件指針的位置,并返回文件指針相對(duì)于文件頭的位置。其中的 offset 參數(shù)用于指定位置, whence 參數(shù)則定義了 offset 的意義, whence 的可取值如下:
? SEEK_SET:offset 是一個(gè)絕對(duì)位置。
? SEEK_END:offset 是以文件尾為參考點(diǎn)的相對(duì)位置。
? SEEK_CUR:offset 是以當(dāng)前位置為參考點(diǎn)的相對(duì)位置。
2、文件操作:C庫(kù)函數(shù)
(1)實(shí)操
代碼:
左右滑動(dòng)查看全部代碼>>>
/*文件操作:c庫(kù)函數(shù)*/ #include
運(yùn)行結(jié)果:

(2)接口說(shuō)明
fopen函數(shù):

? pathname 參數(shù)用于指定要打開(kāi)或創(chuàng)建的文件名。
? mode 參數(shù)用于指定文件的打開(kāi)方式,注意該參數(shù)是一個(gè)字符串,輸入時(shí)需要帶雙引號(hào):
?“r”:以只讀方式打開(kāi),文件指針位于文件的開(kāi)頭。
?“r+”:以讀和寫(xiě)的方式打開(kāi),文件指針位于文件的開(kāi)頭。
?“w”:以寫(xiě)的方式打開(kāi),不管原文件是否有內(nèi)容都把原內(nèi)容清空掉,文件指針位于文件的開(kāi)頭。
?“w+”:同上,不過(guò)當(dāng)文件不存在時(shí),前面的” w”模式會(huì)返回錯(cuò)誤,而此處的” w+”則會(huì)創(chuàng)建新文件。
?“a”:以追加內(nèi)容的方式打開(kāi),若文件不存在會(huì)創(chuàng)建新文件,文件指針位于文件的末尾。與” w+”的區(qū)別是它不會(huì)清空原文件的內(nèi)容而是追加。
?“a+”:以讀和追加的方式打開(kāi),其它同上。
? fopen 的返回值是 FILE 類型的文件文件流,當(dāng)它的值不為 NULL 時(shí)表示正常,后續(xù)的 fread、 fwrite等函數(shù)可通過(guò)文件流訪問(wèn)對(duì)應(yīng)的文件。
fopen 的 mode 與 open 的 flags 參數(shù)關(guān)系:

fread 函數(shù):

stream 是使用 fopen 打開(kāi)的文件流, fread 通過(guò)它指定要訪問(wèn)的文件,它從該文件中讀取 nmemb 項(xiàng)數(shù)據(jù),每項(xiàng)的大小為 size,讀取到的數(shù)據(jù)會(huì)被存儲(chǔ)在 ptr 指向的數(shù)組中。fread 的返回值為成功讀取的項(xiàng)數(shù)(項(xiàng)的單位為 size)。
fwrite 函數(shù):

它的操作與 fread 相反,把 ptr 數(shù)組中的內(nèi)容寫(xiě)入到 stream 文件流,寫(xiě)入的項(xiàng)數(shù)為 nmemb,每項(xiàng)大小為size,返回值為成功寫(xiě)入的項(xiàng)數(shù)(項(xiàng)的單位為 size)。
fclose 函數(shù):

fclose 庫(kù)函數(shù)用于關(guān)閉指定的文件流,關(guān)閉時(shí)它會(huì)把尚未寫(xiě)到文件的內(nèi)容都寫(xiě)出。因?yàn)闃?biāo)準(zhǔn)庫(kù)會(huì)對(duì)數(shù)據(jù)進(jìn)行緩沖,所以需要使用 fclose 來(lái)確保數(shù)據(jù)被寫(xiě)出。
fflush 函數(shù):

fflush 函數(shù)用于把尚未寫(xiě)到文件的內(nèi)容立即寫(xiě)出。常用于確保前面操作的數(shù)據(jù)被寫(xiě)入到磁盤(pán)上。fclose 函數(shù)本身也包含了 fflush 的操作。
fseek 函數(shù):

其中的 offset 參數(shù)用于指定位置, whence 參數(shù)則定義了 offset 的意義, whence 的可取值如下:
? SEEK_SET:offset 是一個(gè)絕對(duì)位置。
? SEEK_END:offset 是以文件尾為參考點(diǎn)的相對(duì)位置。
? SEEK_CUR:offset 是以當(dāng)前位置為參考點(diǎn)的相對(duì)位置。
-
接口
+關(guān)注
關(guān)注
33文章
9344瀏覽量
155801 -
Linux
+關(guān)注
關(guān)注
88文章
11585瀏覽量
217329 -
庫(kù)函數(shù)
+關(guān)注
關(guān)注
0文章
177瀏覽量
34892
原文標(biāo)題:Linux下應(yīng)用開(kāi)發(fā)基礎(chǔ)
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
linux應(yīng)用程序開(kāi)發(fā)與linux系統(tǒng)移植
如何去實(shí)現(xiàn)一種嵌入式Linux應(yīng)用程序開(kāi)發(fā)呢
嵌入式Linux NFS方式下應(yīng)用程序的實(shí)現(xiàn)
Linux下C應(yīng)用程序開(kāi)發(fā)
兩種開(kāi)發(fā) RFID 應(yīng)用程序的方法分析
基于Linux 的兩種分層存儲(chǔ)實(shí)現(xiàn)方案
如何使用Xilinx SDK創(chuàng)建Linux應(yīng)用程序,并進(jìn)行開(kāi)發(fā)和調(diào)試
基于RTLinux實(shí)時(shí)應(yīng)用程序開(kāi)發(fā)模式實(shí)現(xiàn)通信接口的設(shè)計(jì)和使用方式
讀寫(xiě)分離的兩種實(shí)現(xiàn)方式
嵌入式Linux應(yīng)用程序開(kāi)發(fā)-(9)UDP網(wǎng)絡(luò)通信應(yīng)用程序(UDP-Socket)
如何使用linux下gdb來(lái)調(diào)試python程序
linux驅(qū)動(dòng)程序的編譯方法有哪兩種
Linux應(yīng)用層控制外設(shè)的兩種不同的方式

Linux下開(kāi)發(fā)應(yīng)用程序的兩種接口來(lái)實(shí)現(xiàn)
評(píng)論