之前對於檔案的操作通常在乙個程序中完成,最近需要在兩個程序中對同乙個檔案進行操作。故想到了檔案鎖。
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 必須通知執行緒函式庫互斥鎖是在不同程序...