歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux文件鎖flock,檢查程序是否已經運行

在多個進程同時操作同一份文件的過程中,很容易導致文件中的數據混亂,需要鎖操作來保證數據的完整性,這裡介紹的針對文件的鎖,稱之為“文件鎖”-flock。

flock,建議性鎖,不具備強制性。一個進程使用flock將文件鎖住,另一個進程可以直接操作正在被鎖的文件,修改文件中的數據,原因在於flock只是用於檢測文件是否被加鎖,針對文件已經被加鎖,另一個進程寫入數據的情況,內核不會阻止這個進程的寫入操作,也就是建議性鎖的內核處理策略。

Linux中使用flock函數 http://www.linuxidc.com/Linux/2014-03/97466.htm

Linux多進程之間的文件鎖 http://www.linuxidc.com/Linux/2013-09/90155.htm

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會隨著進程的關閉而被自動釋放掉。同時由於damon進程生成時會繼承fd。故此方法有一定的局限性。

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://www.linuxidc.com/Linux/2014-11/109308p2.htm

Copyright © Linux教程網 All Rights Reserved