關於c實現檔案加鎖

2021-08-19 14:46:41 字數 3327 閱讀 5129

2012-02-08 12:56

590人閱讀收藏 

舉報cmd

descriptor

測試struct

library

file

1.記錄鎖的功能

當乙個程序正在讀或修改檔案的某個部分時,它可以阻止其他程序修改同一檔案區。我們不應該從字面上去理解記錄鎖,實際上它應該叫「區域鎖」,因為它鎖定的只是檔案的乙個(也可能是整個檔案)。這個區域用來存放多使用者的共享區。

2.記錄鎖的分類

記錄鎖分為共享讀鎖和獨佔寫鎖,前者也叫做共享鎖後者也叫做排他鎖。

3.加鎖規則

如果乙個程序對共享區加了共享讀鎖,其他程序只能加共享讀鎖。如果乙個程序加了獨佔寫鎖,其他程序就不能加任何鎖。

4.死鎖

如果兩個相互等待對方持有並且不釋放(已被鎖定)的資源是時,則這兩個程序就處於死鎖狀態。如果乙個程序已經控制了檔案的乙個加鎖區域,然後它又試圖對另乙個程序控制的區域加鎖,則它就會睡眠,在這種情況下,有發生死鎖的可能性。

5.鎖的隱含繼承和釋放

(1)鎖與程序和檔案兩方面有關係,它和前者關係是:當乙個程序結束後,他對檔案加的鎖也就消失了。它和後者的關係是:當程序close檔案描述符,切斷檔案和程序的聯絡程序所建立的鎖也會消失。

(2)由fork產生的子程序不繼承父程序所設定的鎖。這意味著,若乙個程序得到一把鎖,然後呼叫fork,那麼對於父程序建立的鎖而言,子程序被視為另乙個程序,不會擁有該鎖。

(3)在執行exec後,新程序可以繼承原執行的鎖。因為執行exec前後還是乙個程序。我們只是改變程序執行的程式,並沒有建立新的程序。

不讓exec繼承原來鎖的方法/* set close-on-exec flag for descriptor */:
加鎖後,
val = fcntl(fd, f_getfd, 0);
val |= fd_cloexec;
fcntl(fd, f_setfd, val);
6.要注意的問題

記錄鎖只是提供競爭進入某段**區的功能,不會導致對檔案操作失敗。也就是說,我們對檔案進行加鎖後,我們還是可以對檔案進行操作。

下面是給乙個檔案加鎖和測試鎖的程式。

/*12_1.c加鎖程式*/

#include 

#include 

#include 

int main(int argc,char *argv)

sleep(10);

close(fd);

exit(0);

}/*12_2.c測試鎖程式*/

#include 

#include 

#include 

int main(int argc,char *argv)

if(lock.l_type==f_unlck)

printf("is not clocked!\n");

else

printf("is clocked!\n");

if(write(fd,buf,sizeof(buf))<0)

perror("wrire error");

close(fd);

exit(0);

}先在後台執行加鎖程式

#./12_1 12_1.c&

然後在十秒之內執行測試鎖的程式

#./12_2 12_1.c

在螢幕上會列印:is clocked!

如果等待10秒12_1.c執行完

再次執行測試鎖的程式則會列印:is not clocked!

12_1 把檔案鎖住,所以12_1.c檔案的資源暫時不可獲得,可12_2 程式仍然可以往12_1.c 裡面寫入"123456"。12_2 10秒後再執行,這時檔案12_1.c 未被加鎖,並且12_2 程式往12_1.c 裡面寫入了"123456"。

功能描述:根據檔案描述詞來操作檔案的特性。 

檔案控制函式

fcntl -- file control

library

standard c library (libc, -lc)

synopsis

#include ; 

int fcntl(int fd, int cmd); 

int fcntl(int fd, int cmd, long arg); 

int fcntl(int fd, int cmd, struct flock *lock); 

[描述]

fcntl()針對(檔案)描述符提供控制.引數fd 是被引數cmd操作(如下面的描述)的描述符.

針對cmd的值,fcntl能夠接受第三個引數int arg

fcntl函式有5種功能: 

1.複製乙個現有的描述符(cmd=f_dupfd). 

2.獲得/設定檔案描述符標記(cmd=f_getfd或f_setfd). 

3.獲得/設定檔案狀態標記(cmd=f_getfl或f_setfl). 

4.獲得/設定非同步i/o所有權(cmd=f_getown或f_setown). 

5.獲得/設定記錄鎖(cmd=f_getlk,f_setlk或f_setlkw).

cmd值:

在修改檔案描述符標誌或檔案狀態標誌時必須謹慎,先要取得現在的標誌值,然後按照希望修改它,最後設定新標誌值。不能只是執行f_setfd或f_setfl命令,這樣會關閉以前設定的標誌位。

fcntl的返回值 與命令有關。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。下列三個命令有特定返回值:f_dupfd,f_getfd,f_getfl以及f_getown。第乙個返回新

的檔案描述符,第二個返回相應標誌,最後乙個返回乙個正的程序id或負的程序組id。

控制fd的例程 如下:

#include 

#include 

#include 

#include 

using namespace std; 

int main(int argc,char* argv) 

;l_type 有三種狀態: 

f_rdlck 建立乙個供讀取用的鎖定 

f_wrlck 建立乙個供寫入用的鎖定 

f_unlck 刪除之前建立的鎖定

l_whence 也有三種方式: 

seek_set 以檔案開頭為鎖定的起始位置。 

seek_cur 以目前檔案讀寫位置為鎖定的起始位置 

seek_end 以檔案結尾為鎖定的起始位置。 

返回值      成功則返回0,若有錯誤則返回-1,錯誤原因存於errno.

C 資料夾加鎖

用c 語言實現乙個資料夾鎖的程式,網上類似的 資料夾 軟體很多,但是基本上都是c c 語言實現的,且都沒有提供原始碼 這個可以理解,畢竟是加密程式,不應該洩露原始碼 程式的基本原理是 用c 語言重新命名資料夾,通過重新命名使之成為windows安全檔案的類識別符號。具體的方法是為資料夾新增拓展名 是...

python檔案加鎖

首先要引入庫 import fcntl 開啟乙個檔案 f open test 對該檔案加密 fcntl.flock f,fcntl.lock ex 這樣就對檔案test加鎖了,如果有其他程序要對test進行加鎖,則不能成功,會被阻塞,但不會退出程式。解鎖 fcntl.flock f,fcntl.lo...

關於SVN更新時檔案加鎖的小結

今天使用svn更新應用,出現了下面的問題 update d workspace acode resource springconf r 6622 force attempted to lock an already locked dir svn working copy d workspace ac...