flock v.s. fcntl

共同點

  1. 都支持阻塞和非阻塞模式

  2. 只能操作于文件,而不是目錄

  3. 當進程結(jié)束或者終止的時候,鎖都會被自動釋放

flock

  1. 只能是勸告鎖,因此其他進程只要擁有合適的權限,可以自由地訪問文件

  2. 和 fd 相對應(BSD lock)

  3. fork、dup 后復制的 fd 擁有相同的鎖,且對其中任意一個 fd 進行 LOCK_UN 操作都會釋放鎖,或者這些 fd 都被關閉

  4. 使用 open 對同一個文件打開兩個 fd,這兩個的 fd 對應的 鎖是相互獨立的:如果使用 fd1 鎖定,那么再使用 fd2 鎖定就會失敗

  5. 獲得的鎖會在 execve 中被保留下來

  6. 將鎖從共享轉(zhuǎn)換成互斥,或者反方向轉(zhuǎn)換,不是原子操作,而是先釋放舊鎖,然后添加新鎖

  7. 不能用于 NFS

  8. 不進行死鎖檢查

fcntl

  1. 勸告記錄鎖

  2. 與(inode, pid)相對應

  3. 鎖不會隨著 fork 而被繼承,但是在 execve 中被保留了下來

  4. 由于 stdio 有緩存,該鎖不應使用 stdio,而應配合 read, write 來使用

  5. 對于文件的一個區(qū)域,一個進程只能擁有一種鎖,如果要在這個區(qū)域施加新鎖,那么舊鎖會被轉(zhuǎn)化成新鎖

  6. 內(nèi)核會進行死鎖檢查

  7. 如果進程關閉了文件的任何一個描述符,則與這個文件相關的所有鎖都會被釋放;線程共享同一個鎖,也就是沒辦法同步線程

  8. 也可以和 fd 相對應,如果如此則解決了第八個問題

  9. 強制鎖,租借鎖

參考

File locking in Linux

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容