日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 嵌入式大雜燴
[導讀]點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記! 應用程序開發(fā)方式 在Linux下開發(fā)應用程序可以調用兩種接口來實現(xiàn),一種是直接調用系統(tǒng)調用接口,另一種是調用庫函數(shù)來實現(xiàn)。 1、什么是系統(tǒng)調用? 系統(tǒng)調用(System Call)是操作系統(tǒng)

點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記!

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


在Linux下開發(fā)應用程序可以調用兩種接口來實現(xiàn),一種是直接調用系統(tǒng)調用接口,另一種是調用庫函數(shù)來實現(xiàn)。

1、什么是系統(tǒng)調用?

系統(tǒng)調用(System Call)是操作系統(tǒng)提供的服務,是應用程序與內核通信的接口。

Linux提供的系統(tǒng)調用包含的內容有:文件操作、進程控制、系統(tǒng)控制、內存管理、網絡管理、socket套接字、進程間通信、用戶管理等。


相對于普通的函數(shù)調用來說, 系統(tǒng)調用的性能消耗也是巨大的。所以在追求極致性能的程序中, 都在盡力避免系統(tǒng)調用。

2、C庫函數(shù)

C標準庫頭文件如下:


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

因為C庫函數(shù)通過系統(tǒng)調用來實現(xiàn),庫函數(shù)對上層提供了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 <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 int fd;                /* 文件描述符 */
 char rd_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("Open file error!\n");
  return 0;
 }
 
 /* 往文件中寫數(shù)據(jù) */
 write(fd, "helllo world\n"strlen("helllo world\n"));
 
 /* 移動文件指針至文件開頭 */
 lseek(fd, 0, SEEK_SET);
 
 /* 讀出文件數(shù)據(jù)并打印 */
 read(fd, rd_buf, 50);
 printf("Read data: %s\n", rd_buf);
 
 /* 關閉文件 */
 close(fd);
 
 return 0;
}

運行結果:

(2)接口說明

open函數(shù):

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

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

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


read函數(shù):

? fd:文件對應的文件描述符 ;

? buf:指向數(shù)據(jù)緩沖區(qū)的指針;

? count:讀取多少個字節(jié)的數(shù)據(jù)。


write函數(shù):

? fd:文件對應的文件描述符; 

? buf:指向數(shù)據(jù)緩沖區(qū)的指針; 

? count:往文件中寫入多少個字節(jié)。


close函數(shù):

關閉 fd 文件描述符對應的文件。


lseek 函數(shù):

lseek 函數(shù)可以用與設置文件指針的位置,并返回文件指針相對于文件頭的位置。其中的 offset 參數(shù)用于指定位置, whence 參數(shù)則定義了 offset 的意義, whence 的可取值如下:

? SEEK_SET:offset 是一個絕對位置。

? SEEK_END:offset 是以文件尾為參考點的相對位置。

? SEEK_CUR:offset 是以當前位置為參考點的相對位置。

2、文件操作:C庫函數(shù)

(1)實操

代碼:

左右滑動查看全部代碼>>>

/* 文件操作:c庫函數(shù) */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 FILE *fp;            /* 文件描述符 */
 char rd_buf[50] = {0}; /* 讀數(shù)據(jù)buf  */ 
 
 /* 以讀寫的方式打開文件demo1_test,若文件不存在則創(chuàng)建文件 */
 fp = fopen("demo1_test""w+");
 if (NULL == fp)
 {
  printf("Open file error!\n");
  return 0;
 }
 
 /* 往文件中寫數(shù)據(jù) */
 fwrite("hello world\n"1strlen("helllo world\n"), fp);
 
 /* 同步緩沖區(qū):把緩沖區(qū)數(shù)據(jù)立即寫入文件 */
 fflush(fp);
 
 /* 移動文件指針至文件開頭 */
 fseek(fp, 0, SEEK_SET);
 
 /* 讀出文件數(shù)據(jù)并打印 */
 fread(rd_buf, 501, fp);
 printf("Read data: %s\n", rd_buf);
 
 /* 關閉文件 */
 fclose(fp);
 
 return 0;
}

運行結果:

(2)接口說明

fopen函數(shù):

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

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

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

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

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

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

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

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

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

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


fread 函數(shù):

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


fwrite 函數(shù):

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


fclose 函數(shù):

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


fflush 函數(shù):

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


fseek 函數(shù):

其中的 offset 參數(shù)用于指定位置, whence 參數(shù)則定義了 offset 的意義, whence 的可取值如下:

? SEEK_SET:offset 是一個絕對位置。

? SEEK_END:offset 是以文件尾為參考點的相對位置。

? SEEK_CUR:offset 是以當前位置為參考點的相對位置。


相關參考書籍:

《Linux環(huán)境編程:從應用到內核》

《野火Linux開發(fā)實戰(zhàn)指南》

《嵌入式Linux上的C語言編程實踐》


以上就是本次的分享,如有錯誤,歡迎指出!謝謝


歡迎大家進群交流、共同進步。同時,我也會關注一些大家問的一些問題,從中挑選一些具有代表性的、并且在我知識范圍內的問題寫出相關文章做分享。

猜你喜歡

Linux下socket編程實例

Windows下socket編程實例

Linux下動態(tài)鏈接與靜態(tài)鏈接

Windows下動態(tài)鏈接與靜態(tài)鏈接

C語言、嵌入式中幾個非常實用的宏技巧

C語言、嵌入式應用:TCP通信實例分析

C語言、嵌入式重點知識:回調函數(shù)

C語言、嵌入式位操作精華技巧大匯總

免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉