Linux多程序之間的檔案鎖

2022-05-15 06:52:59 字數 1887 閱讀 5980

之前對於檔案的操作通常在乙個程序中完成,最近需要在兩個程序中對同乙個檔案進行操作。故想到了檔案鎖。

linux下可以使用flock()函式對檔案進行加鎖解鎖等操作。簡單介紹下flock()函式:

表頭檔案  #include

定義函式  int flock(int fd,int operation);

函式說明  flock()會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔案的某一區域。

引數  operation有下列四種情況:

lock_sh 建立共享鎖定。多個程序可同時對同乙個檔案作共享鎖定。

lock_ex 建立互斥鎖定。乙個檔案同時只有乙個互斥鎖定。

lock_un 解除檔案鎖定狀態。

lock_nb 無法建立鎖定時,此操作可不被阻斷,馬上返回程序。通常與lock_sh或lock_ex 做or(|)組合。

單一檔案無法同時建立共享鎖定和互斥鎖定,而當使用dup()或fork()時檔案描述詞不會繼承此種鎖定。

返回值  返回0表示成功,若有錯誤則返回-1,錯誤**存於errno。

為了更好的移植性,對於檔案的開啟與關閉我選擇了fopen和fclose的組合,但flock的第乙個引數要求的是int型別的檔案描述符。這裡 對fopen返回的file型別的檔案指標進行轉換,轉換為int型的檔案描述符(假設open函式返回的檔案描述符為fd,而fopen返回的檔案指標 為*fp,則fd等價於fp->_fileno).

下面為兩個程序的例項:

#include

#include

#include

#include

int main(void)

file *fp = null;

int i = 20;

if ((fp = fopen("./file_lock.test", "r+b")) == null) //開啟檔案

printf("file open error!\n");

if (flock(fp->_fileno, lock_ex) != 0) //給該檔案加鎖

printf("file lock by others\n");

while(1) //進入迴圈,加鎖時間為20秒,列印倒計時

printf("%d\n", i--);

sleep(1);

if (i == 0)

break;

fclose(fp); //20秒後退出,關閉檔案

flock(fp->_fileno, lock_un); //檔案解鎖

return 0;

#include

#include

#include

#include

int main(void)

file *fp = null;

int i = 0;

if ((fp = fopen("./file_lock.test", "r+b")) == null) //開啟檔案

printf("file open error!\n");

flock(fp->_fileno, lock_ex); //檔案加鎖

while(1) //進入迴圈

printf("%d\n", i++);

sleep(1);

fclose(fp); //關閉檔案

flock(fp->_fileno, lock_un); //釋放檔案鎖

return 0;

首先執行file1.c,緊接著執行file2.c(執行file1.c後20秒內要執行file2.c否則看不到現象)

現象是:file1.c執行起來以後,開始倒計時。此時執行file2.c會阻塞在加鎖處。當file1.c執行20秒後關閉檔案,並釋放檔案鎖後,file2.c會開始執行。

linux多程序之間的檔案鎖

之前對於檔案的操作通常在乙個程序中完成,最近需要在兩個程序中對同乙個檔案進行操作。故想到了檔案鎖。linux下可以使用flock 函式對檔案進行加鎖解鎖等操作。簡單介紹下flock 函式 表頭檔案 include 定義函式 int flock int fd,int operation 函式說明 fl...

linux多程序之間的檔案鎖

之前對於檔案的操作通常在乙個程序中完成,最近需要在兩個程序中對同乙個檔案進行操作。故想到了檔案鎖。linux下可以使用flock 函式對檔案進行加鎖解鎖等操作。簡單介紹下flock 函式 表頭檔案 include 定義函式 int flock int fd,int operation 函式說明 fl...

執行緒鎖用於程序之間

實現程序之間上鎖有多種方式,可以用檔案鎖,但檔案鎖要涉及到檔案系統,十分耗時。其實程序之間也可以用執行緒鎖,因為執行緒鎖不僅可以用於執行緒之間同樣可以用於程序之間。為了在多個程序之間使用執行緒鎖,必須做到 1 互斥鎖變數必須儲存在為所有程序所共享的記憶體中 2 必須通知執行緒函式庫互斥鎖是在不同程序...