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