一: 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_type為F_RDLCK或F_WRLCK)或釋放由lock指向flock結構所描述的鎖,
如果無法設置鎖時,該函數會立即返回一個EACCESS或EAGAIN錯誤,而不會阻塞。
cmd = F_SETLKW, F_SETLKW和F_SETLK的區別是,無法設置鎖的時候,調用進程程會阻塞到該鎖
能夠授權位置。
這里需要注意的是,用F_GETLK測試能否建立一把鎖,然后接着用F_SETLK或F_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有寫權限。
