檔案描述符,open 函式

2021-10-23 23:07:59 字數 4915 閱讀 5950

一、檔案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 來訪問檔案。檔案描述符是非負整數。開啟現存盤案或新建檔案時,核心會返回乙個檔案描述符。讀寫檔案也需要使用檔案描述符來指定待讀寫的檔案。目錄檔案描述符概述 如何建立檔案描述符 使用的好處 缺點...