0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 作者:玩轉(zhuǎn)單片機(jī) ? 2020-09-08 13:52 ? 次閱讀

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

Linux下開發(fā)應(yīng)用程序可以調(diào)用兩種接口來實(shí)現(xiàn),一種是直接調(diào)用系統(tǒng)調(diào)用接口,另一種是調(diào)用庫函數(shù)來實(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)用來說, 系統(tǒng)調(diào)用的性能消耗也是巨大的。所以在追求極致性能的程序中, 都在盡力避免系統(tǒng)調(diào)用。

2、C庫函數(shù)

C標(biāo)準(zhǔn)庫頭文件如下:

Linux環(huán)境下, 使用的C庫一般都是glibc, 它封裝了幾乎所有的系統(tǒng)調(diào)用, 代碼中使用的“系統(tǒng)調(diào)用”, 實(shí)際上就是調(diào)用C庫中的函數(shù)。

因?yàn)镃庫函數(shù)通過系統(tǒng)調(diào)用來實(shí)現(xiàn),庫函數(shù)對(duì)上層提供了C庫接口。比如文件操作:

實(shí)例:文件操作

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

(圖片來源:野火Linux開發(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 #include #include #include #include intmain(void) { intfd;/*文件描述符*/ charrd_buf[50]={0};/*讀數(shù)據(jù)buf*/ /*以讀寫的方式打開文件demo0_test,若文件不存在則創(chuàng)建文件*/ fd=open("demo0_test",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU); if(NULL==fd) { printf("Openfileerror! "); return0; } /*往文件中寫數(shù)據(jù)*/ write(fd,"hellloworld ",strlen("hellloworld ")); /*移動(dòng)文件指針至文件開頭*/ lseek(fd,0,SEEK_SET); /*讀出文件數(shù)據(jù)并打印*/ read(fd,rd_buf,50); printf("Readdata:%s ",rd_buf); /*關(guān)閉文件*/ close(fd); return0; }

運(yùn)行結(jié)果:

(2)接口說明

open函數(shù):

? pathname:要打開或創(chuàng)建的文件名;

? flag:指定文件的打開方式,具體有以下參數(shù),見下表 flag 參數(shù)值。

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

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:往文件中寫入多少個(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庫函數(shù)

(1)實(shí)操

代碼:

左右滑動(dòng)查看全部代碼>>>

/*文件操作:c庫函數(shù)*/ #include #include intmain(void) { FILE*fp;/*文件描述符*/ charrd_buf[50]={0};/*讀數(shù)據(jù)buf*/ /*以讀寫的方式打開文件demo1_test,若文件不存在則創(chuàng)建文件*/ fp=fopen("demo1_test","w+"); if(NULL==fp) { printf("Openfileerror! "); return0; } /*往文件中寫數(shù)據(jù)*/ fwrite("helloworld ",1,strlen("hellloworld "),fp); /*同步緩沖區(qū):把緩沖區(qū)數(shù)據(jù)立即寫入文件*/ fflush(fp); /*移動(dòng)文件指針至文件開頭*/ fseek(fp,0,SEEK_SET); /*讀出文件數(shù)據(jù)并打印*/ fread(rd_buf,50,1,fp); printf("Readdata:%s ",rd_buf); /*關(guān)閉文件*/ fclose(fp); return0; }

運(yùn)行結(jié)果:

(2)接口說明

fopen函數(shù):

? pathname 參數(shù)用于指定要打開或創(chuàng)建的文件名。

? mode 參數(shù)用于指定文件的打開方式,注意該參數(shù)是一個(gè)字符串,輸入時(shí)需要帶雙引號(hào):

?“r”:以只讀方式打開,文件指針位于文件的開頭。

?“r+”:以讀和寫的方式打開,文件指針位于文件的開頭。

?“w”:以寫的方式打開,不管原文件是否有內(nèi)容都把原內(nèi)容清空掉,文件指針位于文件的開頭。

?“w+”:同上,不過當(dāng)文件不存在時(shí),前面的” w”模式會(huì)返回錯(cuò)誤,而此處的” w+”則會(huì)創(chuàng)建新文件。

?“a”:以追加內(nèi)容的方式打開,若文件不存在會(huì)創(chuàng)建新文件,文件指針位于文件的末尾。與” w+”的區(qū)別是它不會(huì)清空原文件的內(nèi)容而是追加。

?“a+”:以讀和追加的方式打開,其它同上。

? fopen 的返回值是 FILE 類型的文件文件流,當(dāng)它的值不為 NULL 時(shí)表示正常,后續(xù)的 fread、 fwrite等函數(shù)可通過文件流訪問對(duì)應(yīng)的文件。

fopen 的 mode 與 open 的 flags 參數(shù)關(guān)系:

fread 函數(shù):

stream 是使用 fopen 打開的文件流, fread 通過它指定要訪問的文件,它從該文件中讀取 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)容寫入到 stream 文件流,寫入的項(xiàng)數(shù)為 nmemb,每項(xiàng)大小為size,返回值為成功寫入的項(xiàng)數(shù)(項(xiàng)的單位為 size)。

fclose 函數(shù):

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

fflush 函數(shù):

fflush 函數(shù)用于把尚未寫到文件的內(nèi)容立即寫出。常用于確保前面操作的數(shù)據(jù)被寫入到磁盤上。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ì)位置。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8357

    瀏覽量

    150517
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11161

    瀏覽量

    208468
  • 庫函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    177

    瀏覽量

    33929

原文標(biāo)題:Linux下應(yīng)用開發(fā)基礎(chǔ)

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux實(shí)現(xiàn)輸入?yún)?shù)求和的兩種方式

    Linux實(shí)現(xiàn)輸入?yún)?shù)求和(兩種方式)
    發(fā)表于 03-26 11:44

    linux應(yīng)用程序開發(fā)linux系統(tǒng)移植

    ,kernel移植,rootfs制作)5.linux驅(qū)動(dòng)開發(fā)從事嵌入式應(yīng)具備的能力  嵌入式開發(fā)本身也有高下之分,至少包含嵌入式應(yīng)用程序工程師和底層的驅(qū)動(dòng)內(nèi)核工程師
    發(fā)表于 12-20 08:19

    如何去實(shí)現(xiàn)嵌入式Linux應(yīng)用程序開發(fā)

    如何去實(shí)現(xiàn)嵌入式Linux應(yīng)用程序開發(fā)呢?如何去實(shí)現(xiàn)在ARM
    發(fā)表于 12-27 06:53

    嵌入式Linux NFS方式應(yīng)用程序實(shí)現(xiàn)

    嵌入式Linux NFS方式應(yīng)用程序實(shí)現(xiàn):本文在以ARM9 內(nèi)核芯片,處理器為S3C2410 構(gòu)造的開發(fā)板系統(tǒng)上,詳細(xì)討論了如何配置嵌入
    發(fā)表于 08-02 14:48 ?39次下載

    LinuxC應(yīng)用程序開發(fā)

    本文介紹了在 Linux能用于 C 應(yīng)用程序開發(fā)和調(diào)試的工具. 本文的主旨是介紹如何在 Linux
    發(fā)表于 05-14 10:16 ?4662次閱讀

    基于嵌入式Linux應(yīng)用程序開發(fā)詳解

    基于嵌入式Linux應(yīng)用程序開發(fā)詳解
    發(fā)表于 10-25 14:17 ?12次下載
    基于嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>應(yīng)用程序</b><b class='flag-5'>開發(fā)</b>詳解

    兩種開發(fā) RFID 應(yīng)用程序的方法分析

    在本文中,我將首先討論兩種開發(fā) RFID 應(yīng)用程序的方法:傳統(tǒng)方法和 RFID Web服務(wù)。然后,我將 討論把 RFID Web服務(wù)集成到多個(gè) SOA 中的 EAI 應(yīng)用程序將如何提高
    發(fā)表于 12-07 04:09 ?808次閱讀

    基于Linux兩種分層存儲(chǔ)實(shí)現(xiàn)方案

    ,如何在 Linux 主機(jī)上,使用 Linux 現(xiàn)有的機(jī)制,實(shí)現(xiàn)數(shù)據(jù)的分層存儲(chǔ)?本文主要介紹了 Linux 平臺(tái)上兩種不同的
    發(fā)表于 06-04 06:24 ?2926次閱讀
    基于<b class='flag-5'>Linux</b> 的<b class='flag-5'>兩種</b>分層存儲(chǔ)<b class='flag-5'>實(shí)現(xiàn)</b>方案

    如何使用Xilinx SDK創(chuàng)建Linux應(yīng)用程序,并進(jìn)行開發(fā)和調(diào)試

    了解如何使用Xilinx SDK創(chuàng)建Linux應(yīng)用程序。 我們還將重點(diǎn)介紹和演示支持Linux應(yīng)用程序開發(fā)和調(diào)試的不同方面的SDK功能。
    的頭像 發(fā)表于 11-20 07:03 ?1w次閱讀

    基于RTLinux實(shí)時(shí)應(yīng)用程序開發(fā)模式實(shí)現(xiàn)通信接口的設(shè)計(jì)和使用方式

    和線程信號(hào)驅(qū)動(dòng)機(jī)制,三者的應(yīng)用重點(diǎn)各不相同。其中前兩種較為常用。由于不的實(shí)現(xiàn)機(jī)理,這兩種接口的應(yīng)用范疇各有側(cè)重。經(jīng)過實(shí)踐,認(rèn)為將以上兩種
    的頭像 發(fā)表于 10-04 18:00 ?2724次閱讀
    基于RTLinux實(shí)時(shí)<b class='flag-5'>應(yīng)用程序</b><b class='flag-5'>開發(fā)</b>模式<b class='flag-5'>實(shí)現(xiàn)</b>通信<b class='flag-5'>接口</b>的設(shè)計(jì)和使用方式

    讀寫分離的兩種實(shí)現(xiàn)方式

    1. 引言 讀寫分離要做的事情就是對(duì)于一條SQL該選擇哪個(gè)數(shù)據(jù)庫去執(zhí)行,至于誰來做選擇數(shù)據(jù)庫這件事兒,無非個(gè),要么中間件幫我們做,要么程序自己做。因此,一般來講,讀寫分離有兩種實(shí)現(xiàn)
    的頭像 發(fā)表于 09-29 14:51 ?1.3w次閱讀

    嵌入式Linux應(yīng)用程序開發(fā)-(9)UDP網(wǎng)絡(luò)通信應(yīng)用程序(UDP-Socket)

    基于UDP協(xié)議的網(wǎng)絡(luò)通信應(yīng)用程序(UDP-Socket)前篇文章介紹了基于TCP/IP協(xié)議的網(wǎng)絡(luò)通信應(yīng)用程序。嵌入式Linux應(yīng)用程序
    發(fā)表于 11-02 12:21 ?35次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>應(yīng)用程序</b><b class='flag-5'>開發(fā)</b>-(9)UDP網(wǎng)絡(luò)通信<b class='flag-5'>應(yīng)用程序</b>(UDP-Socket)

    如何使用linuxgdb調(diào)試python程序

    如何使用linuxgdb調(diào)試python程序? 在Linux,可以使用GDB(GNU調(diào)試器
    的頭像 發(fā)表于 01-31 10:41 ?2217次閱讀

    linux驅(qū)動(dòng)程序的編譯方法有哪兩種

    Linux驅(qū)動(dòng)程序的編譯方法主要可以歸納為兩種: 手動(dòng)編譯 和 使用內(nèi)核構(gòu)建系統(tǒng)(Makefile)自動(dòng)編譯 。 1. 手動(dòng)編譯 手動(dòng)編譯驅(qū)動(dòng)程序通常涉及直接使用GCC(GNU Com
    的頭像 發(fā)表于 08-30 14:39 ?376次閱讀

    Linux應(yīng)用層控制外設(shè)的兩種不同的方式

    眾所周知,linux下一切皆文件,那么應(yīng)用層如何控制硬件層,同樣是通過 文件I/O的方式實(shí)現(xiàn)的,那么應(yīng)用層控制硬件層通常有兩種方式。
    的頭像 發(fā)表于 10-05 19:03 ?149次閱讀
    <b class='flag-5'>Linux</b>應(yīng)用層控制外設(shè)的<b class='flag-5'>兩種</b>不同的方式