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(用來清除鎖)
共享鎖允許多個進程同時對文件進行都操作,亦稱讀鎖
獨佔鎖用來隔離文件內容,防止被其他進程所寫,亦稱互斥鎖。