應用程序開發(fā)方式

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




相對于普通的函數調用來說, 系統(tǒng)調用的性能消耗也是巨大的。所以在追求極致性能的程序中, 都在盡力避免系統(tǒng)調用。
2、C庫函數
C標準庫頭文件如下:

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

實例:文件操作
Linux下文件操作應用程序結構如下:

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

(2)接口說明
open函數:

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

? mode:當 open 函數的 flag 值設置為 O_CREAT 時,必須使用 mode 參數來設置文件與用戶相關的權限。mode 可用的權限如下表所示,表中各個參數可使用” | “來組合。

read函數:

? fd:文件對應的文件描述符 ;
? buf:指向數據緩沖區(qū)的指針;
? count:讀取多少個字節(jié)的數據。
write函數:

? fd:文件對應的文件描述符;
? buf:指向數據緩沖區(qū)的指針;
? count:往文件中寫入多少個字節(jié)。
close函數:

關閉 fd 文件描述符對應的文件。
lseek 函數:

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

(2)接口說明
fopen函數:

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

fread 函數:

stream 是使用 fopen 打開的文件流, fread 通過它指定要訪問的文件,它從該文件中讀取 nmemb 項數據,每項的大小為 size,讀取到的數據會被存儲在 ptr 指向的數組中。fread 的返回值為成功讀取的項數(項的單位為 size)。
fwrite 函數:

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

fclose 庫函數用于關閉指定的文件流,關閉時它會把尚未寫到文件的內容都寫出。因為標準庫會對數據進行緩沖,所以需要使用 fclose 來確保數據被寫出。
fflush 函數:

fflush 函數用于把尚未寫到文件的內容立即寫出。常用于確保前面操作的數據被寫入到磁盤上。fclose 函數本身也包含了 fflush 的操作。
fseek 函數:

其中的 offset 參數用于指定位置, whence 參數則定義了 offset 的意義, whence 的可取值如下:
? SEEK_SET:offset 是一個絕對位置。
? SEEK_END:offset 是以文件尾為參考點的相對位置。
? SEEK_CUR:offset 是以當前位置為參考點的相對位置。
-
接口
+關注
關注
33文章
9491瀏覽量
156577 -
Linux
+關注
關注
88文章
11681瀏覽量
218578 -
庫函數
+關注
關注
0文章
177瀏覽量
34997
原文標題:Linux下應用開發(fā)基礎
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
linux應用程序開發(fā)與linux系統(tǒng)移植
如何去實現(xiàn)一種嵌入式Linux應用程序開發(fā)呢
嵌入式Linux NFS方式下應用程序的實現(xiàn)
Linux下C應用程序開發(fā)
兩種開發(fā) RFID 應用程序的方法分析
基于Linux 的兩種分層存儲實現(xiàn)方案
如何使用Xilinx SDK創(chuàng)建Linux應用程序,并進行開發(fā)和調試
基于RTLinux實時應用程序開發(fā)模式實現(xiàn)通信接口的設計和使用方式
讀寫分離的兩種實現(xiàn)方式
嵌入式Linux應用程序開發(fā)-(9)UDP網絡通信應用程序(UDP-Socket)
Linux下開發(fā)應用程序的兩種接口來實現(xiàn)
評論