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 這個式子與上面式子的區別在於用...