在多個進程同時操作同一份文件的過程中,很容易導致文件中的數據混亂,需要鎖操作來保證數據的完整性,這里介紹的針對文件的鎖,稱之為“文件鎖”-flock。
頭文件:#include<sys/file.h>
函數:定義函數 int flock(int fd,int operation);
1.闡述
flock,建議性鎖,不具備強制性。一個進程使用flock將文件鎖住,另一個進程可以直接操作正在被鎖的文件,修改文件中的數據,原因在於flock只是用於檢測文件是否被加鎖,針對文件已經被加鎖,另一個進程寫入數據的情況,內核不會阻止這個進程的寫入操作,也就是建議性鎖的內核處理策略。
2.flock操作類型
(1)LOCK_SH 共享鎖,多個進程可以使用同一把鎖,常被用作讀共享鎖; (2)LOCK_EX 排他鎖,同時只允許一個進程使用,常被用作寫鎖; (3)LOCK_UN 釋放鎖;
(4)LOCK_NB 無法建立鎖定時,此操作可不被阻斷,馬上返回進程。通常與LOCK_SH或LOCK_EX 做OR(|)組合。
3.應用(供兩種工作模式:阻塞與非阻塞類型。)
(1)進程使用flock嘗試鎖文件時,如果文件已經被其他進程鎖住,進程會被阻塞直到鎖被釋放掉
服務會阻塞等待直到鎖被釋放:
flock(lockfd,LOCK_EX)
(2)在調用flock的時候,采用LOCK_NB參數,在嘗試鎖住該文件的時候,發現已經被其他服務鎖住,會返回錯誤,errno錯誤碼為EWOULDBLOCK
服務會返回錯誤發現文件已經被鎖住時:
ret = flock(lockfd,LOCK_EX|LOCK_NB) return:ret = -1, errno = EWOULDBLOCK
4.flock所釋放:
(1)調用LOCK_UN參數來釋放文件鎖
(2)關閉該文件的方式來釋放文件鎖(flock會隨着進程的關閉而被自動釋放掉)
5.使用flock檢測進程是否已經存在
int checkexit(char* pfile){
if (pfile == NULL)
return -1;
int lockfd = open(pfile,O_RDWR);//pfile 執行程序所在路徑
if (lockfd == -1)
return -2;//打開文件出錯
int iret = flock(lockfd,LOCK_EX|LOCK_NB)
if (iret == -1)
return -3;//該進程已經存在
return 0;
}
出處:http://blog.csdn.net/jiang1013nan/article/details/17849499
