共同點
都支持阻塞和非阻塞模式
只能操作于文件杂穷,而不是目錄
當(dāng)進程結(jié)束或者終止的時候,鎖都會被自動釋放
flock
只能是勸告鎖拄轻,因此其他進程只要擁有合適的權(quán)限摘刑,可以自由地訪問文件
和 fd 相對應(yīng)(BSD lock)
fork、dup 后復(fù)制的 fd 擁有相同的鎖捧杉,且對其中任意一個 fd 進行 LOCK_UN 操作都會釋放鎖陕见,或者這些 fd 都被關(guān)閉
使用 open 對同一個文件打開兩個 fd秘血,這兩個的 fd 對應(yīng)的 鎖是相互獨立的:如果使用 fd1 鎖定味抖,那么再使用 fd2 鎖定就會失敗
獲得的鎖會在 execve 中被保留下來
將鎖從共享轉(zhuǎn)換成互斥评甜,或者反方向轉(zhuǎn)換,不是原子操作仔涩,而是先釋放舊鎖忍坷,然后添加新鎖
不能用于 NFS
不進行死鎖檢查
fcntl
勸告記錄鎖
與(inode, pid)相對應(yīng)
鎖不會隨著 fork 而被繼承,但是在 execve 中被保留了下來
由于 stdio 有緩存熔脂,該鎖不應(yīng)使用 stdio佩研,而應(yīng)配合 read, write 來使用
對于文件的一個區(qū)域,一個進程只能擁有一種鎖霞揉,如果要在這個區(qū)域施加新鎖旬薯,那么舊鎖會被轉(zhuǎn)化成新鎖
內(nèi)核會進行死鎖檢查
如果進程關(guān)閉了文件的任何一個描述符,則與這個文件相關(guān)的所有鎖都會被釋放适秩;線程共享同一個鎖绊序,也就是沒辦法同步線程
也可以和 fd 相對應(yīng),如果如此則解決了第八個問題
強制鎖秽荞,租借鎖