day 08 檔案管理

2021-08-03 16:12:09 字數 2272 閱讀 9298

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...