linux 文件記錄鎖詳解


一: linux記錄鎖更恰當的稱呼應該是范圍鎖,它是對文件某個范圍的鎖定。

 

關於記錄鎖的功能就是fcntl提供的第五個功能,具體使用如下:

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

cmd = F_GETLK, 主要用來檢測是否有某個已存在鎖會妨礙將新鎖授予調用進程,
        如果沒有這樣的鎖,
lock所指向的flock結構的l_type成員就會被置成F_UNLCK
        否則已存在的鎖的信息將會寫入
lock所指向的flock結構中cmd = F_SETLK,設置鎖
cmd = F_SETLK, 設置(l_typeF_RDLCKF_WRLCK)或釋放由lock指向flock結構所描述的鎖,
        如果無法設置鎖時,該函數會立即返回一個
EACCESSEAGAIN錯誤,而不會阻塞。

cmd = F_SETLKW, F_SETLKWF_SETLK的區別是,無法設置鎖的時候,調用進程程會阻塞到該鎖
         能夠授權位置。

這里需要注意的是,用F_GETLK測試能否建立一把鎖,然后接着用F_SETLKF_SETLKW企圖建立一把鎖,
由於這兩者不是一個原子操作,所以不能保證兩次
fcntl之間不會有另外一個進程插入並建立一把相關的鎖,
從而使一開始的測試情況無效。所以一般不希望上鎖時阻塞,會直接通過調用
F_SETLK,並對返回結果進行
測試,以判斷是否成功建立所要求的鎖。


//POSIX標准只定義fock結構中必須有以下的數據成員,具體實現可以增加
struct flock { short l_type; /* 鎖的類型: F_RDLCK, F_WRLCK, F_UNLCK */ short l_whence; /* 加鎖的起始位置:SEEK_SET, SEEK_CUR, SEEK_END */ off_t l_start; /* 加鎖的起始偏移,相對於l_whence */ off_t l_len; /* 上鎖的字節數*/ pid_t l_pid; /* 已經占用鎖的PID(只對F_GETLK 命令有效) */ /*...*/ };

文件記錄鎖操作規范圖:


二: 文件記錄鎖位於V-node table這個結構中,使用PID作為鎖擁有者的標識。這使其擁有如下特點:

1) 記錄鎖采用(PID, start,end)三元組作為鎖標識,一個文件可擁有多個記錄鎖,同一區域只允許有一個記錄鎖。

2) 當進程終止(正常/不正常),該進程擁有的所有記錄鎖都將釋放。

3) 同一個進程中,指向同一文件(i-node)的fd都可以操作該文件上的記錄鎖:如釋放、修改等。顯式調用F_UNLCK和close(fd)都將釋放鎖,close將釋放整個文件中該進程擁有的所有記錄鎖。

4) 記錄鎖不被fork的子進程繼承(PID不同)。

5) 記錄鎖的類型轉換、改變鎖范圍等操作均為原子的。

6) 未設置FD_CLOEXEC時,記錄鎖將被exec后的進程繼承(PID相同)。

7) 記錄鎖對文件打開mode有要求:加讀鎖要求fd有讀權限;加寫鎖要求fd有寫權限。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM