Linux 文件鎖

                     在文已經共享的狀況下如何操做,也就是當多個進程同時操做同一個文件時,咱們怎麼保證文件數據的正確性。linux一般採用的方法是文件上鎖,來避免共享資源的產生競爭狀態。linux

                    文件鎖包括建議性鎖和強制性的鎖。建議性的,顧名思義,相對溫柔一些,在對文件進行鎖操做時,會檢測是否已經有鎖存在,而且尊重已有的鎖。在通常的狀況下,內核和系統都不使用建議鎖。強制性的鎖是由內核執行的鎖,當一個文件被上鎖進行寫入操做的時候,內核將阻止其餘進程對其進行讀寫操做。採起強制性的鎖對性能的影響很大,每次進行讀寫操做都必須檢查是否有鎖存在。函數

                      在linux中對文件進行鎖操做,能夠使用lockf()和fcntl()這兩個函數,前者對文件施加建議性鎖,後者爲兩種鎖都行。另外fcntl還能夠對文件的某一記錄上鎖。性能

                      fcntl使用格式爲:進程

                      int fcntl(int fd,int cmd,struct flock *lock);資源

                      fd爲文件描述符,cmd爲一些命令參數,flcok結構體用來設置記錄鎖的具體狀態。cmd

                     fcntl() 對已打開的文件描述符進行操做,並根據命令參數的不一樣可以執行不一樣的任務。關於文件鎖的幾個命令選項以下:
方法

       F_GETLK 根據lock參數值,決定是否上文件鎖
       F_SETLK 設置lock參數值的文件鎖
       F_SETLKW 這是 F_GETLK的阻塞版本,在沒法獲取鎖時,會進入睡眠狀態。
      

     
      flock結構體的定義以下:
       struct flock {
           
                  short l_type;
                  off_t l_start;
                 short l_whence;
                 off_t l_len;
                 pid_t l_pid;
     }

     l_type有三個選項:
    F_RDLCK
    : 共享鎖,只讀用
    F_WRLCK : 獨佔鎖(寫操做鎖)

                   F_UNLCK : 解除鎖定im

                  l_start 爲相對位移量數據

                  l_whence 必須是如下幾個值之一( 在 unistd.h 中定義):
                  SEEK_SET : 文件開始位置
                  SEEK_CUR: 文件當前位置
                  SEEK_END: 文件末尾位置img


                   l_len 加鎖的長度

                   l_pid當前文件操做的進程id號

                  下面是簡單的例子

                  

                   運行結果:

                 

                 

                  讀是能夠共享的。

                


                 寫的例子:

                


               運行結果:

             

同時寫的話,發生競爭,後者不能對文件作寫操做,只有噹噹前的鎖解開,後續的纔可寫文件

相關文章
相關標籤/搜索