關於關於read()和write()的this question,我想知道每個打開的文件描述是否有自己的讀寫緩衝區,或者文件打開時可能有多個讀寫緩衝區時間一次。我很好奇,因爲這會對重疊寫入同一文件時發生的事情產生影響。也許這在Unix之間有所不同? (根據我的理解,「文件描述」是指關於打開的文件的信息/選項,例如當前的標記位置,「文件描述符」與此相反,僅指引用過程中引用的數字以描述。)每個Unix文件描述是否都有自己的讀/寫緩衝區?
5
A
回答
4
這取決於你是否在談論套接字或實際文件。
嚴格地說,描述符從來沒有自己的緩衝區;它只是一個句柄到更深的抽象。
文件系統對象有自己的「緩衝區」,至少在需要的時候。也就是說,如果一個程序寫入小於文件系統塊大小,內核別無選擇,只能讀取一個FS塊並將寫入與現有數據合併。
該緩衝區連接到vnode,並在較低級別,可能是inode。它由文件擁有,而不是描述符。如果內存可用,它可能會保持很長時間。
在套接字的情況下,流,但不是一個特定的描述符,實際上確實擁有它擁有的緩衝區。
+0
謝謝。正如別人在另一個問題中提到的,這可能會因操作系統的不同而有所不同,但是通常底層文件系統的整個塊都會單獨進行緩衝,並且每個緩衝區塊在許多讀者/作者可能正在訪問的文件中共享。這聽起來有點像它自己的迷你分頁系統,當寫入時單個塊緩衝區會被標記爲髒。很高興知道套接字,儘管我主要對「常規」文件感到好奇。 – Jegschemesch 2011-03-05 06:13:18
0
如果文件在阻塞模式下打開,那麼應該只有一個緩衝區。我敢打賭,由於性能的原因,默認值是非阻塞的。
相關問題
- 1. 地圖的每個區域是否都有自己的班級?
- 2. java中BufferedOutputStream的好處是什麼?是否每個OutputStream都沒有緩衝區?
- 3. 什麼是緩衝區?什麼是緩衝讀取和寫入?
- 4. 讀寫緩衝區發出
- 5. 瞭解Unix文件描述
- 6. PHP/Smarty - 每個文件都有它自己的語言文件
- 7. 我是否需要爲每個緩衝區創建一個新的描述符集?
- 8. Unix讀取緩衝區參數
- 9. 逐行讀取文本文件並從緩衝區掃描 - C
- 10. 每個雲實例是否都有自己的IP
- 11. 每個JSpinner對象是否都有自己的Model對象?
- 12. 每個GAE實例是否有其自己的內存緩存?
- 13. 我自己的z緩衝區
- 14. 總共有多少個讀或寫文件描述符?
- 15. getchar()函數是否有自己的緩衝區來存儲剩餘的輸入?
- 16. 讀取緩衝區中的* .wav文件
- 17. 每個DAPP是否有自己的區塊鏈?
- 18. JVM是否攔截磁盤事務/有其自己的磁盤緩衝區?
- 19. kmalloc中的緩衝區是否也是DMA安全緩衝區?
- 20. 是文件描述符表自我維護每個進程
- 21. 每個商店都有自己的媒體文件夾?
- 22. 等待可讀文件描述符和可寫文件描述符
- 23. 讀取文件時驗證每個讀取的字節數組緩衝區
- 24. Unix中的文件描述符幫助
- 25. 讀取和寫入二進制文件的緩衝區
- 26. 如何在內存中獲取緩衝區的文件描述符?
- 27. 閱讀jpeg文件char *緩衝區c
- 28. python文件讀取緩衝區邊界
- 29. aio_write是否總是寫入整個緩衝區?
- 30. 模型中每個網格的緩衝區是否最優?
我認爲低級別的Unix I/O大多是無緩衝的。但是,如果以流的形式打開(fopen等),則會爲FILE結構創建一個緩衝區。 – seand 2011-03-05 04:02:41
@seand就我的理解而言,除非使用O_DIRECT打開文件,否則默認情況下會緩存讀取/寫入。基於流的I/O庫實際上增加了第二層緩衝,這次是在這個過程中。 – Jegschemesch 2011-03-05 06:23:07