flock 函式 檔案鎖

2021-08-29 01:33:11 字數 3726 閱讀 1781

檔案鎖是一種檔案讀寫機制,在任何特定的時間只允許乙個程序訪問乙個檔案。利用這種機制能夠使讀寫單個檔案的過程變得更安全。這裡我們使用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...