2020-12-11:多個線程同時寫同一個日志文件,為什么相互寫的內容不會被覆蓋?
福哥答案2020-12-11:
[答案來自此鏈接:](https://bbs.csdn.net/topics/398512874)
這是道面試題,可惜我沒什么思路,網上找了些答案。如果有更好的答案,請直接評論。
1.沒看代碼前,以為會用到緩存隊列+組提交。
2.golang的日志源碼位于log/log.go中的Output方法。加鎖了。
3.系統級別。當打開文件并設置了O_APPEND標識,內核會共享文件寫入游標,保證內容不會被覆蓋。
這個問題涉及到 系統底層 ,這就要看 操作 系統, 與 Windows 不同, Linux 允許一個文件在寫入的時候被讀取(或者在被讀取的時候寫入)。
Linux 通過文件描述符表維護了打開的文件描述符信息,而文件描述符表中的每一項都指向一個內核維護的文件表,文件表指向打開的文件的 vnode(Unix) 和 inode。同時,文件表保存了進程對文件讀寫的偏移量等信息。
但是 那么我們要如何保證讀取與寫入的一致性呢? Linux 提供了 fcntl 系統調用,可以鎖定文件。
文件鎖是與進程相關的,一個進程中的多個線程/協程對同一個文件進行的鎖操作會互相覆蓋掉,從而無效。
fcntl 創建的鎖是建議性鎖,只有寫入的進程和讀取的進程都遵循建議才有效;對應的有強制性鎖,會在每次文件操作時進行判斷,但性能較差,因此 Linux/Unix 系統默認采用的是建議性鎖。
***
[評論](https://user.qzone.qq.com/3182319461/blog/1607641238)
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。