linux檔案操作函式說明

2021-06-09 17:03:23 字數 4525 閱讀 4798

1:open_max常量

1> 檔案描述符的範圍:0 ~~open_max

2> 早期unix版本規定open_max=19,即乙個程序可以開啟20個檔案

3> 現在unix擴充套件了,一般open_max=63,即乙個程序可以開啟64個檔案了

2:open函式

原型 : int open(const char *pathname, into flag, …/*, mode_t mode */) ;

標頭檔案 : #include

#include // 定義了o_rdwr等常量

#include

作用 : 開啟或建立乙個檔案

引數 :

oflag

1> 下面三個常量只能選擇乙個:o_rdonly, o_wronly, o_rdwr

2> 下面的幾個常量可以選擇乙個或者多個進行組合:

2> o_creat : 如果檔案不存在時,則建立此檔案。使用此選項時,

同時說明第三個引數mode,用其說明該新檔案的

訪問許可權位

3> o_excl : 這個標誌可以用來測試檔案是否存在,用法:

同時設定o_excl和o_creat兩個標誌,如果

檔案存在,則呼叫open函式會出現錯誤

4> o_trunc : 如果此檔案存在,而且設定為唯讀或者只寫模式,則

將其長度截短至0

5> o_nonblock: 如果pathname指向的是乙個fifo,乙個塊裝置或者

字元裝置檔案,則此選項為此檔案開啟和後續的i/o

操作設定非阻塞方式

6> o_sync : 最嚴格的同並方式,wirte操作在資料和屬性都寫在

物理磁碟後才返回

3:creat函式

1> 原型 : int creat(const char *pathname, o_rdonly | o_creat | o_trunc)

2> 標頭檔案 : #include

#include

#include

3> 作用 : 新建乙個檔案,現在可以不用這個函式,直接用open這個函式就可以了

4:creat函式的缺點

1> 只能以寫的方式來開啟乙個檔案

2> 在早期時,如果要建立乙個臨時檔案,則應該先creat,然後close,然後再open

3> 現在直接就可以利用這種方式了:

open (pathname, o_rdonly | o_creat | o_trunc, mode_t) ;

5:close函式

1> 原型 : int close

2> 標頭檔案 :

3> 作用 : 關閉乙個檔案

6:關於close檔案的兩個注意點

1> 檔案關閉之後,那麼在此檔案上的所有鎖將自動消失

2> 當程式結束後,檔案也自動會被關閉,很多程式利用這一特性

7:lseek函式

1> 原型 : off_t lseek(int fd, off_t offset, int whence)

2> 標頭檔案 : #include

#include

3> 作用 : 動態定位檔案指標的位置,使得可以隨機訪問

4> 引數 :

int whence :

1> seek_set :以檔案開頭為參照

2> sekk_cur :以檔案當前指標為參照

3> seek_end :以檔案末尾為參照

off_t offset

可以正,也可以復

8:關於lseek的返回值

1> 對於普通檔案,如果呼叫lseek成功,則返回值是非負值

2> 對於一些裝置檔案,如果呼叫lseek成功,則返回值可能是負值

―――――――――――――――――――

所以,在測試lseek是否成功被呼叫時,應該檢驗它的返回值是不是-1,而不是檢驗它是不是< 0

9:lseek的延長檔案

1> lseek只在核心中記錄檔案的位置

2> 可以讓lseek的結果大於檔案的長度,當下次寫時,那麼就會延長檔案,中間的部分用0來填充

10:read函式

1> 原型 : int read(int fd, void *buf, size_t size) ;

2> 標頭檔案 :

#include

3> 引數 :

void *buf : 緩衝區

size_t size : 要求讀的位元組數目

4> 返回值 :

ø >0 :實際讀到的位元組數目

ø -1 :讀時發生錯誤

ø 0 :說明達到檔案末尾

11:write函式

1> 原型 : int write(int fd, void *bf, size_t size) ;

2> 標頭檔案 :

#include

3> 引數 :

void *buf :緩衝區

size_t size :要求寫入的位元組數目

4> 返回值 :

ø >0 :實際寫入的位元組數目

ø -1 :表示寫操作失敗

―――――――――――――――――――

12:一般write操作失敗的原因

1> 磁碟已經寫滿

2> 超過了乙個給定程序的檔案長度限制

13:bufsize的大小對讀寫時間的影響

1> 隨著bufsize的增大,時間逐漸縮短

2> 當縮短到一定值時,則不會再縮短

14:核心使用三種資料結構來表示檔案共享的關係

1> 乙個程序對應的各個fd的記錄專案

2> 乙個fd對應乙個檔案表

3> 乙個檔案表還對應乙個v結構

15:三種資料結構的組織結構如下所示

1> 每乙個程序都對應乙個表----程序表項,其中的記錄以fd為索引

2> 程序表象中的每一條記錄的後部分有乙個指標,指向檔案表相

3> 檔案表相的最後有乙個v節點指標,指向v資料結構

―――――――――――――

注意:1> 核心為所有開啟的檔案維護一張檔案表

2>

檔案表的內容:

1> 檔案狀態標誌(讀,寫,增寫,同步,非阻塞)

2> 當前檔案位移量

3> v節點指標

3> v節點

1> 包含檔案型別

2> 和對此檔案操作的函式指標的資訊

16:多個檔案描述符項指向同一檔案表項的情況:

1> 這是允許的

2> 當使用

dup函式時,則就會出現不同檔案描述符指向相同檔案表的情況

3> 父程序和子程序之間也是這種情況

17注意:

當兩個程序或者乙個程序開啟乙個檔案兩次時,則會建立兩個檔案表項,這樣才能保證每個程序都具有

自己的一些屬性(例如:讀寫位置等)

18:兩個程序開啟同一檔案時的圖示

1> 檔案表項可以有多個

2> v節點只有乙個

19:注意

任何乙個包含兩個或兩個以上的函式操作都不可能為原子操作,因為在兩個函式中間,核心可能會置換 程序

20:注意

當兩個以上的程序同時寫同乙個檔案時,可能會出現問題

前提:兩個程序寫同一份檔案時的資料結構如上圖所示

――――――――――――――詳細表述―――――――――――――――

程序a和程序b它們的任務相同,都是定位到1500位元組處,然後往裡面寫入東西

1> 程序a開啟檔案file,並利用lseek定位到1500位元組處

2> 程序b開啟檔案file,並利用lseek定位到1500位元組處

3> 核心排程程序b執行,則程序b執行寫操作,假設寫了100個位元組,則v節點裡面的資訊會更新

到1600位元組處

4> 接著,核心排程程序a執行,則程序a執行寫操作,但是因為程序a的檔案表項裡面的檔案讀寫

指標是1500位元組,所以這個時候程序a會從1500位元組處來寫資料

從上面可以看處,已經出現問題了

21: dup函式的兩種

1> int dup(int fd)

2> int dup(int fd1, int fd2)

22: int dup(int fd1, int fd2) 說明

1> 引數 :

fd1 : 已知的

fd2 : 想申請的fd數值

2> 情況:

1> 如果fd2已經開啟,先將其關閉

2> 如果fd2 = fd1,則返回fd2,不關閉它

3> 如果fd2沒有開啟,則直接複製

23:注意

程式執行時,設定o_sync會增加時間

24:fcntl函式的5種功能

1> 複製乙個現存的檔案描述符

2> 獲得/設定檔案描述符標記

3> 獲得/設定檔案狀態標誌

4> 獲得/設定非同步i/o有權

5> 獲得/設定記錄鎖

函式說明python函式巢狀筆記 函式說明

ps 今天上午,非常鬱悶,有很多簡單基礎的問題搞得我有些迷茫,哎,幾天不寫就忘。目前又不當coo,還是得用心記 哦!關於函式內嵌函式作用域的條記 def test i 0defa print locals a printi test 這段,locals 的值為空,說明內嵌的a函式沒有認默引入i de...

CFile Open函式說明

1 nopenflags cfile modecreate 建立乙個新的檔案,如果檔案存在將檔案擷取成長度為0。cfile modenotruncate 此標誌總是與modecreate 配合使用,如果檔案存在,不將檔案擷取成長度為0 如果檔案不存在即建立新檔案。這個功能往往很好用,比如說,當你需要...

signal函式說明

c traps and pitfalls 對signal函式解釋得非常詳細。中void signal int sig,void handler int int int p 這是乙個函式指標,p所指向的函式是乙個不帶任何引數,並且返回值為int的乙個函式.int fun 這個式子與上面式子的區別在於用...