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