嵌入式Linux C程式設計學習之路(七)—— Open/Close函式
1. input & output:站在應用層考慮
Input:核心-->使用者,從核心讀取資料或從檔案讀取資料 ————read函式
Output:使用者-->核心,寫資料到核心或寫資料到檔案中 ————write函式
2. 核心中檔案太多了,寫到哪個檔案,從哪個檔案中讀呢?這些功能由核心管理,又稱檔案管理。
因此read/write時需要有引數指定某個檔案,而且在read/write之前需要open,建立或開啟檔案。同時操作完後還要把檔案關閉close。
3. open函式
open(char *, flag, mode)在fcntl.h檔案中宣告。函式的作用:建立或開啟某個檔案,引數:最多有三個引數;
第一個引數,char * 包含有檔名和路徑
第二個引數:flag 開啟檔案的方式
第三個引數:mode 建立檔案的許可權。 //在建立檔案時需要有許可權的引數;如果開啟檔案,則不需要這個引數Ø flag內容如下:
flag |
功能 |
O_RDONLY |
只讀 |
O_WRONLY |
只寫 |
O_RDWR |
讀寫 |
O_CREAT |
建立一個檔案 |
O_EXCL |
如果使用O_CREAT時檔案存在,則可返回錯誤訊息。這一 引數可測試檔案是否存在。 |
O_TRUNC |
開啟檔案(會把已經存在的內容給刪除)。 |
O_APPEND |
追加方式開啟檔案(不會把已經存在的內容給刪除)。 |
Ø 返回值:
成功:檔案描述符,它是一個非負的正整數,即檔案的ID號,相當於人的身份證號;
出錯:-1。
Open 函式建立檔案時的許可權是:
== mode &(~umask)
B111 111 111& ~(B 000 010 010) = B 111 101 101
4. 檔案描述符概述
核心的一個重要功能是檔案管理,系統有非常多的檔案,核心怎樣認識每一個檔案呢?核心採用ID號的方式標識這些檔案,inode號,node號表示不同的檔案,比如ls –lai i,只要檔案不一樣,inode號就不一樣。那麼這些核心的檔案的ID號,在每個使用者的程式中怎樣對映的呢?即是檔案描述符。
ID號有什麼規律呢?從0開始累加,程式進行時(程序),核心會自動開啟3個檔案描述符,0,1,2,分別對應,標準輸入、輸出和出錯,這樣在程式中,每開啟一個檔案,檔案描述符值從3開始累加。
5. close指令
close(fd),
呼叫close()函式可以關閉一個開啟的檔案。
呼叫成功返回0,出錯返回-1,並設定errno;
注:當一個程序終止時,該程序開啟的所有檔案都由核心自動關閉;
6. 實現touch指令
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
int main(int argc, char * argv[]){
int fd;
fd = open(argv[1],O_CREAT | O_RDWR, 0777);
if(fd < 0){
printf("create file %s error",argv[1]);
return -1;
}
printf("create file %s success, fd=%s\n",argv[1],fd);
close(fd);
return 0;
}