Linux文件鎖flock
在多個進程同時操作同一份文件的過程中,很容易導致文件中的數據混亂,需要鎖操作來保證數據的完整性,這里介紹的針對文件的鎖,稱之為“文件鎖”-flock。
flock,建議性鎖,不具備強制性。一個進程使用flock將文件鎖住,另一個進程可以直接操作正在被鎖的文件,修改文件中的數據,原因在於flock只是用於檢測文件是否被加鎖,針對文件已經被加鎖,另一個進程寫入數據的情況,內核不會阻止這個進程的寫入操作,也就是建議性鎖的內核處理策略。
flock主要三種操作類型:
LOCK_SH,共享鎖,多個進程可以使用同一把鎖,常被用作讀共享鎖;
LOCK_EX,排他鎖,同時只允許一個進程使用,常被用作寫鎖;
LOCK_UN,釋放鎖;
進程使用flock嘗試鎖文件時,如果文件已經被其他進程鎖住,進程會被阻塞直到鎖被釋放掉,或者在調用flock的時候,采用LOCK_NB參數,在嘗試鎖住該文件的時候,發現已經被其他服務鎖住,會返回錯誤,errno錯誤碼為EWOULDBLOCK。即提供兩種工作模式:阻塞與非阻塞類型。
服務會阻塞等待直到鎖被釋放:
flock(lockfd,LOCK_EX)
服務會返回錯誤發現文件已經被鎖住時:
ret = flock(lockfd,LOCK_EX|LOCK_NB)
同時ret = -1, errno = EWOULDBLOCK
flock鎖的釋放非常具有特色,即可調用LOCK_UN參數來釋放文件鎖,也可以通過關閉fd的方式來釋放文件鎖(flock的第一個參數是fd),意味着flock會隨着進程的關閉而被自動釋放掉。
flock其中的一個使用場景為:檢測進程是否已經存在;
int checkexit(char* pfile) { if (pfile == NULL) { return -1; } int lockfd = open(pfile,O_RDWR); 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