一、檔案io學習大綱。
1、檔案io概念、檔案概念、檔案型別。
2、訪問檔案方法一 -> 系統io 開啟?/讀取?/寫入?/關閉?
3、系統io檔案描述符概念?檔案描述符與檔案的關係?檔案描述符的值。
4、檔案偏移量概念。
5、系統io應用例項:lcd液晶、觸控螢幕。
6、系統io另外一種訪問檔案的方式:記憶體對映。 -> 針對lcd液晶
7、訪問檔案方法二 -> 標準io 開啟?/讀取?/寫入?/關閉?
8、標準io函式:處理字元/字串
9、目錄io:訪問目錄,切換目錄,讀取目錄,關閉目錄。
二、檔案io概念?
1、什麼是檔案?
在linux下,一切都是檔案。
除了我們平時常見的檔案:1.txt/2.jpg/3.bmp/4.***是檔案之外,linux系統還會把硬體裝置當作是檔案,例如:led燈、觸控螢幕、lcd液晶螢幕,蜂鳴器,adc,這些硬體裝置在linux的眼中,都是檔案來的。
2、什麼是io?
io -> input/output -> 輸入/輸出
檔案io -> 對檔案資料輸入/輸出 -> 寫入資料到檔案/從檔案中讀取資料出來。
3、如何實現檔案讀取/寫入?
不需要使用者寫自定義函式,因為在linux下,已經有現成的函式來實現。
訪問檔案方式有兩種:
系統io -> 系統呼叫 -> 2 system calls -> 系統io介面都是在第2手冊。
標準io -> 庫呼叫 -> 3 library calls -> 標準io介面都是在第3手冊。
4、使用系統io與標準io訪問有什麼區別?
系統io來處理檔案,沒有緩衝區,直接按位元組來處理。
標準io來處理檔案,有緩衝區,按塊來處理。
作用物件:
訪問硬體裝置檔案時(led燈、觸控螢幕、lcd液晶) -> 直接使用系統io來處理。
例如: 寫乙個溫濕度感測器驅動 -> 使用系統io來訪問溫濕度感測器驅動
訪問普通檔案(1.txt/2.bmp/3.jpg/4.***) -> 標準io來處理。
例如:訪問test.txt這個檔案 -> 使用標準io來訪問。
5、檔案型別。 -> 7種。
'-' 普通檔案 -> 標準io
'd' 目錄檔案 -> 目錄io
'l' 鏈結檔案
'p' 管道檔案 -> 系統io
's' 套接字檔案
'c' 字元裝置檔案 -> 系統io
'b' 塊裝置檔案 -> 系統io
三、如何使用系統io訪問檔案?
1、如何開啟檔案? -> open() -> man 2 open
函式功能:open and possibly create a file
//開啟和建立檔案。
標頭檔案:
#include
#include
#include
函式原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
引數:pathname:需要開啟的那個檔案的路徑名。 (絕對路徑/相對路徑)
flags:
o_rdonly:唯讀
o_wronly:只寫
o_rdwr:可讀可寫
返回值:
成功:新的檔案描述符file descriptor(其實就是乙個最小,非負整數,沒有使用過的)
失敗:-1
注意:open函式什麼時候會開啟失敗?
1)你開啟的路徑不存在時。
2)如果檔案本身的許可權不允許,那麼操作許可權不對,也會失敗。
例如: 檔案本身的許可權: "-wx-wx-wx",如果以o_rdonly/o_rdwr去開啟檔案,那麼就會失敗。
2、如何關閉檔案? -> close() -> man 2 close
函式功能:close a file descriptor
//關閉掉乙個檔案描述符
標頭檔案:
#include
函式原型:
int close(int fd);
引數:fd:需要關閉的那個檔案的檔案描述符。
返回值:
成功:0
失敗:-1
練習1: 寫程式,訪問家目錄下test.txt,如果訪問成功,則輸出"open file success",否則輸出"open file error",並關閉檔案,如果關閉成功,則輸出"close file success",否則輸出"close file error"。
#include
#include
#include
#include
#include
int main(int argc,char *ar**)
else
printf("fd = %d\n",fd);
ret = close(fd);
if(ret == 0)
else
return 0;
}練習2: 看看訪問之後的那個檔案的檔案描述符是多少? -> 3
練習3: 嘗試訪問一下開發板中/dev/fb0這個檔案,訪問之後就關閉它。
#include
#include
#include
#include
#include
int main(int argc,char *ar**)
close(fd);
return 0;
}四、檔案描述符?
1、什麼是檔案描述符?
檔案描述符是open函式的返回值,當open()執行成功時,就會返回非負,最小,沒有使用過的整數。
例如:3=open("1.txt"); //3就是代表這個1.txt這個檔案。
4=open("2.txt"); //4就是代表這個2.txt這個檔案。
a105=open("關國源") //a105就是代表這個關國源這個檔案。
結論:將來需要處理檔案時,我們不需要提供檔案名字,只需要提供檔案對應的檔案描述符就可以。
2、訪問檔案時,傳送fd從3開始分配,說明0/1/2已經被占用,究竟是誰在占用?
其實在系統啟動時,就會預設開啟3個檔案,分別是"標準輸入","標準輸出","標準出錯",他們其實是乙個巨集定義來的,是被定義在乙個標頭檔案中,標頭檔案路徑:/usr/include/unistd.h
/* standard file descriptors. */
#define stdin_fileno 0 //標準輸入 -> 物件:鍵盤
#define stdout_fileno 1 //標準輸出 -> 物件:螢幕
#define stderr_fileno 2 //標準出錯 -> 物件:螢幕
可以理解: 只要系統啟動, 0 = open("標準輸入")
3、舉例子。
假設當前目錄下有:a.txt b.txt c.txt d.txt
開啟a.txt
開啟b.txt
開啟c.txt
關閉b.txt
開啟d.txt
關閉a.txt
關閉c.txt
開啟a.txt
開啟c.txt
關閉d.txt
開啟d.txt -> 返回值是多少? --> 4
結論:開啟乙個檔案時候,就會得到乙個檔案描述符。 -> 申請資源
關閉乙個檔案時候,這個檔案對應的檔案描述符就可以被別人使用。-> 釋放資源
4、研究檔案描述符有沒有最大值?
#include
#include
#include
#include
int main(int argc,char *ar**)
}return 0;
}範圍:0~1023。
記住:開啟檔案之後,記得要關閉!
五、open函式的拓展引數。
int open(const char *pathname, int flags, mode_t mode);
pathname:需要開啟的檔案的路徑
flags:
必選(三選一)
o_rdonly:唯讀
o_wronly:只寫
o_rdwr:可讀可寫
例子1:測試o_creat是否能建立檔案。
#include
#include
#include
#include
#include
int main(int argc,char *ar**)
close(fd);
return 0;
}如果檔案是存在的:
o_creat -> 不建立,開啟成功
o_creat|o_excl -> 不建立,開啟失敗 o_excl就是要確保o_creat這個引數建立了才會生效!
如果檔案是不存在的:
o_creat -> 建立檔案並且開啟成功
o_creat|o_excl -> 建立檔案並且開啟成功
例子2: 測試o_trunc能不能清空?
#include
#include
#include
#include
#include
int main(int argc,char *ar**)
close(fd);
return 0;
}一般地,o_creat|o_trunc 連用,會有什麼效果?
100%確保執行之後檔案是存在的,並且是空白的!
mysql 檔案描述符 檔案描述符
toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...
檔案描述符
檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...
檔案描述符
作業系統程序表中存放各個檔案進行檔案描述 核心 kernel 利用檔案描述符 file descriptor 來訪問檔案。檔案描述符是非負整數。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。目錄檔案描述符概述 如何建立檔案描述符 使用的好處 缺點...