檔案鎖是一種檔案讀寫機制,在任何特定的時間只允許乙個程序訪問乙個檔案。利用這種機制能夠使讀寫單個檔案的過程變得更安全。這裡我們使用flock()函式。
flock函式說明
flock()會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔案的某一區域。
表頭檔案 #include
定義函式 int flock(int fd,int operation);
引數 operation有下列四種情況:
lock_sh 建立共享鎖定。多個程序可同時對同乙個檔案作共享鎖定。
lock_ex 建立互斥鎖定。乙個檔案同時只有乙個互斥鎖定。
lock_un 解除檔案鎖定狀態。
lock_nb 無法建立鎖定時,此操作可不被阻斷,馬上返回程序。通常與lock_sh或lock_ex 做or(|)組合。
單一檔案無法同時建立共享鎖定和互斥鎖定,而當使用dup()或fork()時檔案描述詞不會繼承此種鎖定。
返回值 返回0表示成功,若有錯誤則返回-1,錯誤**存於errno。
用法:flock只要在開啟檔案後,需要對檔案讀寫之前flock一下就可以了,用完之後再flock一下,前面加鎖,後面解鎖。
程序使用flock嘗試鎖檔案時,如果檔案已經被其他程序鎖住,程序會被阻塞直到鎖被釋放掉,或者在呼叫flock的時候,採用lock_nb引數,在嘗試鎖住該檔案的時候,發現已經被其他服務鎖住,會返回錯誤。
flock鎖的釋放非常具有特色,即可呼叫lock_un引數來釋放檔案鎖,也可以通過關閉fd的方式來釋放檔案鎖(flock的第乙個引數是fd),意味著flock會隨著程序的關閉而被自動釋放掉
示例**
test1.c:
#include
#include
#include
int main()
file *f = fopen("temp", "w+");
if(!f)
printf("error file\n");
return 0;
if(0 == flock(fileno(f), lock_ex))
printf("lock...\n");
getchar();
fclose(f);
flock(fileno(f), lock_un);
else
printf("lock failed\n");
return 0;
test2.c
#include
#include
#include
#include
#include
#include
#include
int main()
file *fp;
char text="this is a test!";
if((fp = fopen("temp", "w+")) == 0)
printf("can't open file!\n");
else
printf("open file success!\n");
int i = flock(fileno(fp), lock_sh | lock_nb); // 加鎖以判斷檔案是否已經被加鎖了
printf("%d\n", i);
flock(fileno(fp), lock_un);
fwrite(text, strlen(text), 1, fp);
fclose(fp);
return 0;
測試如下:
在終端1中,執行test1
在終端2中,執行test2
i == 0 表示檔案加鎖成功, i == -1 表示檔案已被加鎖,不建議執行後續操作,這裡為-1表示檔案已經被加鎖。
檔案鎖是一種檔案讀寫機制,在任何特定的時間只允許乙個程序訪問乙個檔案。利用這種機制能夠使讀寫單個檔案的過程變得更安全。這裡我們使用flock()函式。
flock函式說明
flock()會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔案的某一區域。
表頭檔案 #include
定義函式 int flock(int fd,int operation);
引數 operation有下列四種情況:
lock_sh 建立共享鎖定。多個程序可同時對同乙個檔案作共享鎖定。
lock_ex 建立互斥鎖定。乙個檔案同時只有乙個互斥鎖定。
lock_un 解除檔案鎖定狀態。
lock_nb 無法建立鎖定時,此操作可不被阻斷,馬上返回程序。通常與lock_sh或lock_ex 做or(|)組合。
單一檔案無法同時建立共享鎖定和互斥鎖定,而當使用dup()或fork()時檔案描述詞不會繼承此種鎖定。
返回值 返回0表示成功,若有錯誤則返回-1,錯誤**存於errno。
用法:flock只要在開啟檔案後,需要對檔案讀寫之前flock一下就可以了,用完之後再flock一下,前面加鎖,後面解鎖。
程序使用flock嘗試鎖檔案時,如果檔案已經被其他程序鎖住,程序會被阻塞直到鎖被釋放掉,或者在呼叫flock的時候,採用lock_nb引數,在嘗試鎖住該檔案的時候,發現已經被其他服務鎖住,會返回錯誤。
flock鎖的釋放非常具有特色,即可呼叫lock_un引數來釋放檔案鎖,也可以通過關閉fd的方式來釋放檔案鎖(flock的第乙個引數是fd),意味著flock會隨著程序的關閉而被自動釋放掉
示例**
test1.c:
#include
#include
#include
int main()
file *f = fopen("temp", "w+");
if(!f)
printf("error file\n");
return 0;
if(0 == flock(fileno(f), lock_ex))
printf("lock...\n");
getchar();
fclose(f);
flock(fileno(f), lock_un);
else
printf("lock failed\n");
return 0;
test2.c
#include
#include
#include
#include
#include
#include
#include
int main()
file *fp;
char text="this is a test!";
if((fp = fopen("temp", "w+")) == 0)
printf("can't open file!\n");
else
printf("open file success!\n");
int i = flock(fileno(fp), lock_sh | lock_nb); // 加鎖以判斷檔案是否已經被加鎖了
printf("%d\n", i);
flock(fileno(fp), lock_un);
fwrite(text, strlen(text), 1, fp);
fclose(fp);
return 0;
測試如下:
在終端1中,執行test1
在終端2中,執行test2
linux使用flock檔案鎖
使用linux flock 檔案鎖實現任務鎖定,解決衝突 格式 flock sxun w fd flock sxon w file c command flock help flock util linux ng 2.17.2 usage flock sxun w fd flock sxon w f...
linux使用flock檔案鎖
使用linux flock 檔案鎖實現任務鎖定,解決衝突 格式 flock sxun w fd flock sxon w file c command flock help flock util linux ng 2.17.2 usage flock sxun w fd flock sxon w f...
php中檔案鎖函式flock函式用法簡介
php中檔案鎖函式flock函式用法簡介 語法 bool flock int handle int operation int wouldblock flock 操作的 handle 必須是乙個已經開啟的檔案指標。operation 可以是以下值之一 1.要取得共享鎖定 讀取程式 將 operati...