linux 中的文件鎖

Linux運行多個進程同時對一文件進行讀寫,雖然每一個read和write都是原子操作,但內核並沒有在兩個讀寫操作之間加以同步。因此,當一個進程多次調用read讀文件時,就有可能在某兩次讀之間被另一進程所寫,因此,讀的的值將發生錯誤,造成了文件數據的隨機性衝突,爲解決此類併發進程對共享文件的訪問控制問題,Linux設計了鎖機制。

對文件加鎖有兩種:文件鎖和記錄鎖。文件鎖(文件鎖定)用來鎖定整個文件,記錄鎖(文件區鎖定)用來鎖定文件的某一區域,甚至是某一個字節。文件鎖實現了不同進程對文件的共享與獨佔。

文件鎖通過以原子操作的方式創建鎖文件,確保該文件在同一時刻不會被其他程序創建。在進程打開文件時以O_RDWR | O_CREATE | O_EXCL模式,對整個文件進行加鎖。

eg:  open(lock_file , O_RDWR | O_CREATE | O_EXCL, 0444)

記錄鎖通過fcntl函數,以struct flock實現對文件設定鎖。fcntl亦用來對文件鎖信息的查詢。

eg: fcntl(int fildes, int command, struct flock *)

其中:command可以爲:F_GETLK   F_SETLK   F_SETLKW

flock結構體:

struct flock{

short  l_type;  /鎖類型

short  l_whence;//鎖起始位置

off_t  l_start;//鎖偏移地址

off_t  l_len;//區域長度

pid_t  l_pid;//持有鎖的進程號

}

記錄鎖類型:共享鎖F_RDLCK、獨佔鎖F_WRLCK、解鎖F_UNLCK(用來清除鎖)

共享鎖允許多個進程同時對文件進行都操作,亦稱讀鎖

獨佔鎖用來隔離文件內容,防止被其他進程所寫,亦稱互斥鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章