linux檔案鎖詳解 設計檔案很底層的操作

2021-06-08 23:45:06 字數 2067 閱讀 8970

linux低階檔案程式設計中也講到

多使用者多工作業系統中非常重要的乙個內容就是檔案鎖。使用者在更新檔案時,期望可以使用某種機制,防止兩種程序同時更新檔案同一區域而造成丟失,或者防止檔案內容在未更新完畢時被讀取等併發引起的問題,這種機制就是檔案鎖。

程序在操作檔案期間,可以使用檔案鎖,鎖定檔案中的敏感部分,防止其他程序越權操作該部分資料。函式fcntl提供了對檔案任意區域置鎖的能力,既可以鎖住全部檔案,又可以鎖住檔案的部分記錄,故檔案鎖又成為"記錄鎖".

根據檔案鎖的訪問方式,可以區分讀鎖和寫鎖兩種。讀鎖又名共享鎖,它用來防止程序讀取的檔案記錄被更改。檔案記錄可以同時設定多個讀鎖,但當有乙個讀鎖存在時,就不能在該記錄出設定寫鎖。

寫鎖又名互斥鎖,它用來保證檔案更改記錄時不被干擾,確保檔案一致性和完整性,防止寫丟失或讀"髒"資料。檔案記錄一旦設定了寫鎖,就不能再設定任意鎖,除非寫鎖接觸。

檔案記錄在同一時刻,可以設定多個讀鎖,單僅能設定乙個寫鎖,並且讀、寫不能不能同時存在。

當函式fntl專用於鎖操作時,其原型為:

int fcntl(int fildes,int cmd,struct flock *arg);

其中,結構flock用於描述檔案鎖的資訊,定義於"fcntl.h"中,如下表示:

1. struct flock 

2. ; 

當函式fcntl專用於鎖時,引數cmd的三種取值:

f_getlk

f_setlk

f_setlkw

2)檔案鎖操作

在鎖機制的使用中,最常見的操作有鎖的請求、釋放和測試等,這些操作代買基本類似

以下函式都是作者自己做的封裝:

(1)測試鎖

設計函式seelock,它查詢檔案描述符fd對應檔案的鎖資訊,其原型為:

void seelock(int fd,int start,int len);

函式查詢描述符fd對應檔案從偏移start出開始的len位元組中的鎖資訊

1. /*----測試所

原始碼----lock1.c----*/ 

2. void seeklock(int fd,int start,int len) 

3.  

(2)申請讀鎖

共享鎖申請函式getreadlock,原型為:

void getreadlock(int fd,int start,int len);

以阻塞模式在檔案描述符fd相應的檔案中申請共享讀鎖,鎖定的區域從偏移start處開始的len位元組

1. /*---阻塞申請共享讀鎖原始碼---lockl.c*/ 

2. void getreadlock(int fd,int start,int len) 

3.  

(3)申請寫鎖

void getwritelock(int fd,int start,int len);

1. /*---阻塞申請共享寫鎖原始碼---lockl.c*/ 

2. void getreadlock(int fd,int start,int len) 

3.  

(4)釋放鎖

設計檔案鎖釋放函式releaselock,原型為:

void releaselock(int fd,int start,int len);

1. /*---釋放鎖原始碼---lockl.c*/ 

2. void getreadlock(int fd,int start,int len) 

3.  

以下是乙個檔案鎖控制程序的例項,如下:

1. #include

2. #include

3. void main() 

4.  

12.   seelock(fd,0,10); 

13.   getreadlock(fd,0,10);/*申請讀鎖*/ 

14.   seelock(fd,11,20); 

15.   getwritelock(fd,11,20);/*申請寫鎖*/ 

16.   sleep(30); 

17.   releaselock(fd,0,10); 

18.   releaselock(fd,11,20); 

19. } 

linux檔案鎖詳解 設計檔案很底層的操作

多使用者多工作業系統中非常重要的乙個內容就是檔案鎖。使用者在更新檔案時,期望可以使用某種機制,防止兩種程序同時更新檔案同一區域而造成丟失,或者防止檔案內容在未更新完畢時被讀取等併發引起的問題,這種機制就是檔案鎖。程序在操作檔案期間,可以使用檔案鎖,鎖定檔案中的敏感部分,防止其他程序越權操作該部分資料...

Linux flock檔案鎖詳解

摘要1 摘要2 摘要3 用flock命令解決linux計畫任務重複執行 在做計畫任務的時候,可能由於某些問題,任務沒有執行完成,導致任務重複的執行,解決這個問題,只需要乙個flock命令就可以了。1.建立s 件 vim test.sh bin bash echo hello world sleep ...

linux檔案鎖例子

lock.c include include include include struct flock file lock short type,short whence close fd lock2.c.同lock.c相比只是修改了下buf內容 include include include in...