2 access
(1)建議鎖/檔案鎖的由來
當兩個程序在同一時刻向同乙個檔案中寫入資料時,可能造成資料的交錯和不一致問題;
當乙個程序在向檔案中寫入資料的同時,另外乙個程序讀取檔案中資料時可能造成資料的不一致性問題;
當兩個程序同時讀取同乙個檔案資料時,可以同時進行;
沒有讀寫操作讀取操作寫入操作
讀取ok
okno
寫入ok
nono
為了實現上述**的效果,linux系統中引入了檔案鎖的機制,檔案鎖本質上就是讀寫鎖,一把讀鎖和一把寫鎖,其中讀鎖是一把共享鎖,允許其他程序加讀鎖,但不能加寫鎖;寫鎖是一把排它鎖,不允許其它程序加讀鎖/寫鎖(君子協定)。
(2)使用f_setlk作為函式實參的用法
當鎖的型別是:f_rdlck
|f_wrlck
時,實現加鎖效果;
當鎖的型別是:f_unlck
時,實現解鎖效果;
具體的鎖資訊由該函式的第三個引數來指定;
當檔案上已經擁有衝突鎖時,該函式呼叫失敗,返回-1並設定errno的數值;
當前區域無任何鎖當前區域有讀鎖當前區域有寫鎖
加讀鎖ok
okno
加寫鎖ok
nono
由程式結果可知:
當檔案被放置檔案鎖之後,資料還是可以寫入到檔案的,也就是說檔案鎖並不能控制其他程序的讀寫操作,但是檔案鎖可以控制其他程序是否加鎖成功(兩個讀鎖除外)
思考:
如何實現檔案鎖對其他程序讀寫操作的控制呢???
解決方案:
一般來說,每次進行讀寫操作之前可以先嘗試加讀寫鎖,如果讀寫鎖能夠加上,則進行讀寫操作,如果讀寫鎖不能加上,則放棄讀寫操作,從而實現上述效果;
釋放鎖的主要方式:
a. 將鎖的型別設定為f_unlck
,使用fcntl()
呼叫即可;
b. 使用close()
關閉檔案描述符時,與該描述符有關的檔案鎖全部被自動釋放;
c. 當程序結束時,與該程序有關的檔案鎖全部被釋放;
(3)使用f_setlkw作為函式實參的用法
功能與f_setlk
類似,所不同的是當檔案上已經擁有衝突的鎖資訊時,該函式呼叫並不會返回失敗,而是一直等待直到檔案上存在的鎖被釋放為止;
(4)使用f_getlk作為函式實參的用法
呼叫fcntl()的第三個實參是描述要放置在檔案上的鎖資訊,如果該鎖能夠被放在檔案上,則不會真正地去放置,只是將鎖的型別改為f_unlck
,結構體其他成員保持不變;
如果該鎖不能被放置在檔案上,則fcntl()
會用檔案上已經存在的鎖資訊去替換第三個引數描述的鎖資訊,並將l_pid
的數值設定為真正給檔案加鎖程序的程序號;
注意:
一般來說,為了避免和其他程序同時進行讀寫操作,在每次進行讀寫操作之前嘗試加讀寫鎖,如果成功放置讀寫鎖時,則進行讀寫操作,在執行完畢讀寫操作之後,再釋放讀寫鎖;如果不能成功放置讀寫鎖,則主動放棄讀寫操作;
#include
int access(const
char *pathname, int mode);
引數:
*pathname
:字串形式的檔案路徑名;
mode
:具體的操作模式;
f_ok
- 判斷檔案是否存在
r_ok
- 判斷檔案是否可讀
w_ok
- 判斷檔案是否可寫
x_ok
- 判斷檔案是否可執行
功能:主要用於檢查檔案的存在性以及是否擁有對應的許可權;
練習:查詢和嘗試使用stat()
;
明日預報:
(1)檔案的管理
(2)目錄的管理
(3)程序的管理
day08 檔案操作
1 三種字串 1 u 普通字串 u abc 預設的文字方式,以字元作為文字的輸出方式 2 b 二進位制字串 b ascii碼 以二進位制 位元組 作為文字輸出方式,且文字內容必須為ascii碼 3 r 原義字串 r n t 將引號中的轉移字串以原本的意義表示出來 多用於檔案路徑的表示 2 檔案操作步...
day08 檔案操作
open 開啟 f 檔案控制代碼 open 檔案的路徑 檔案放的位置 mode 操作檔案的模式 encoding 檔案的編碼 內建函式 f open 蘿莉小姐姐 號 mode r encoding utf 8 print f.read f.close with open 自動關閉檔案 with op...
python學習筆記day08 檔案功能詳解
file open dang mode r encoding utf 8 print type file.read str物件 read 函式中可以寫引數,指定讀取幾個字元 字元 你能看到的文字最小組成單位 file open dang mode r encoding utf 8 print fil...