1.1.什麼是應用程式設計
(1)典型的嵌入式產品就是基於linux系統來工作的。典型的嵌入式產品研發過程為:第1步是讓linux系統在硬體上跑起來(系統移植工作);第2步是基於linux系統來開發應用程式實現產品功能。
(2)基於linux去做應用程式設計,其實就是通過呼叫linux的系統api來實現應用需要完成的任務。
1.2.作業系統api和檔案io介面
(1)api是一些函式,這些函式由linux系統提供支援,由應用程式來使用。應用層程式通過呼叫api來呼叫作業系統中的各種功能,實現具體的任務。學習乙個作業系統,其實就是學習使用這個作業系統的api。
(2)io就是input/output,輸入/輸出。檔案io的的意思就是讀寫檔案。
(3)linux系統中常用的檔案io介面函式:open、close、write、read、lseek。
1.3.檔案操作的一般步驟
(1)在linux系統中要操作檔案,一般是先open開啟檔案,得到檔案描述符,然後對檔案進行讀寫操作(或其它操作),最後close關閉檔案即可。
(2)我們對檔案進行操作時,一定要先開啟檔案,開啟成功後才能去操作,如果開啟失敗,後面就無法操作了; 最後讀寫完成後一定要close關閉檔案,否則可能會造成檔案損壞。
(3)檔案平時是存放在塊裝置中的檔案系統中的,這種檔案稱為靜態檔案。當我們使用open開啟檔案時,linux核心做的操作包括:核心在程序中建立了開啟該檔案的資料結構,記錄下我們開啟的這個檔案;核心在記憶體中申請一段記憶體,並且將靜態檔案的內容從塊裝置中讀取到記憶體中特定位址管理存放,這種檔案稱為動態檔案。
(4)當開啟檔案後,我們針對該檔案的所有讀寫操作,都是針對記憶體中存放的動態檔案的;當我們對動態檔案進行讀寫後,此時記憶體中的動態檔案和塊裝置中的靜態檔案就不同步了;當我們close關閉動態檔案時,close內部核心會將記憶體中的動態檔案的內容同步到塊裝置中的靜態檔案。
(5)核心設計檔案操作的原理:因為塊裝置本身以塊為單位進行讀寫操作的特性就決定了核心對塊裝置進行操作非常不靈活;而記憶體可以按位元組為單位進行操作,並且可隨機操作,非常靈活。
1.4.檔案描述符
(1)檔案描述的實質是乙個數字,該數字在某個程序中表示某個特定的含義,當我們open開啟檔案時,作業系統在記憶體中構建了一些資料結構來表示這個動態檔案,然後返回給應用程式乙個數字作為檔案描述符,該數字就和記憶體中維護這個動態檔案的資料結構掛鉤繫結了,以後應用程式如果要操作這個動態檔案,只需使用該檔案描述符進行區分即可。
(2)檔案描述符就是用來區分乙個程式開啟的多個檔案的;檔案描述符的作用域就是當前程序,出了當前程序該檔案描述符就木有意義了。
1.5.開啟檔案和關閉檔案
(1)linux中的檔案描述符fd的合法範圍是0或者乙個正整數,不可能是乙個負數。
(2)open返回的fd必須儲存好,以後對該檔案的所有操作都要靠該fd去對應該檔案,最後關閉檔案時也需要fd去指定關閉該檔案。如果在該檔案關閉前丟掉了fd,那麼該檔案就無法讀寫和關閉了。
1.6.實時查詢man手冊
(1)當我們編寫應用程式時,很多api原型都不可能記得,所以要實時查詢man手冊。
(2)man 1 xx查shell命令,man 2 xx查api,man 3 xx查庫函式。
1.7.讀取檔案內容
(1)ssize_t read(int fd, void *buf, size_t count);
fd表示要讀取哪個檔案,fd一般由前面的open返回得到。
buf是應用程式自己提供的一段記憶體緩衝區,用來儲存讀出的內容。
count是我們想要讀取的位元組數。
返回值表示實際成功讀取的位元組數。
(2)返回值ssize_t型別是linux核心用typedef重定義的乙個型別,其實就是int。其目的是為了構建平台無法**,方便程式遷移平台,使**具有更好的可移植性。
1.8.向檔案寫入
(1)寫入用write系統呼叫,write的原型和理解方法和read相似。
(2)注意const在buf前面的作用是該引數buf是作為輸入型引數,輸入型引數在函式中是唯讀的,不能更改。
(3)注意buf的指標型別為void空型別,即該函式操作的資料流沒有明確的型別,可操作所有型別的資料。
(4)該示例程式中剛才成功寫入14位元組,然後讀出結果讀出是0(但是讀出成功了),可考慮該問題的原因是啥。
1.file_open
/* * 公司:***x
* 部落格:
* github:
* 專案:檔案操作的主要介面api
* 功能:乙個簡單的檔案讀寫例項。
*/#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
; // 構建緩衝區存放從檔案讀出的內容
char bufwrite[20] = "linux is great"; // 構建緩衝區存放要寫入檔案的內容
fd = open("test.txt", o_rdwr); // 開啟test.txt檔案
if (-1 == fd) // 判斷檔案開啟是否成功,也可這樣寫if (fd < 0)
else
ret = write(fd, bufwrite, strlen(bufwrite)); // 寫內容到檔案中
if (ret < 0) // 判斷內容是否成功寫入檔案
else
ret = read(fd, buf, sizeof(buf)); // 讀取檔案內容
if (ret < 0) // 判斷讀取檔案是否成功
else
close(fd); // 關閉檔案
return
0;}
2 檔案操作的主要介面API
1 典型的嵌入式產品就是基於嵌入式linux作業系統來工作的。典型的嵌入式產品研發過程是 第一步讓linux系統在硬體上跑起來 系統移植工作 第二步基於linux系統來開發應用程式實現產品功能。2 基於linux去做應用程式設計,其實就是通過呼叫linux的系統api來實現應用需要完成的任務。3 熟...
檔案操作的主要介面API
朱老師物聯網大講堂 學習筆記 學習乙個作業系統,就是學習如何使用這個作業系統的api,就好像練習乙個新英雄,要學會使用他的技能,並結合召喚師峽谷環境特點,發揮你的實力。操作檔案,得先open,得到檔案描述符,若沒有open成功,無法得到檔案描述符,也就無法操作,在進行read,write等操作後,要...
1 檔案測試 2 檔案操作
1 檔案測試函式 2 檔案操作 新建檔案 fopen filename,w 以 寫 的方式開啟乙個不存在的檔案,就會新建該檔案 檔案刪除 unlink 檔案複製 copy filename,aaa bb.txt 盡量使用 和相對路徑,因為linux只認 也沒有磁碟分割槽,而windows 和 都認 ...