2011-03-05 77 views
5

關於關於read()和write()的this question,我想知道每個打開的文件描述是否有自己的讀寫緩衝區,或者文件打開時可能有多個讀寫緩衝區時間一次。我很好奇,因爲這會對重疊寫入同一文件時發生的事情產生影響。也許這在Unix之間有所不同? (根據我的理解,「文件描述」是指關於打開的文件的信息/選項,例如當前的標記位置,「文件描述符」與此相反,僅指引用過程中引用的數字以描述。)每個Unix文件描述是否都有自己的讀/寫緩衝區?

+1

我認爲低級別的Unix I/O大多是無緩衝的。但是,如果以流的形式打開(fopen等),則會爲FILE結構創建一個緩衝區。 – seand 2011-03-05 04:02:41

+1

@seand就我的理解而言,除非使用O_DIRECT打開文件,否則默認情況下會緩存讀取/寫入。基於流的I/O庫實際上增加了第二層緩衝,這次是在這個過程中。 – Jegschemesch 2011-03-05 06:23:07

回答

4

這取決於你是否在談論套接字或實際文件。

嚴格地說,描述符從來沒有自己的緩衝區;它只是一個句柄到更深的抽象。

文件系統對象有自己的「緩衝區」,至少在需要的時候。也就是說,如果一個程序寫入小於文件系統塊大小,內核別無選擇,只能讀取一個FS塊並將寫入與現有數據合併。

該緩衝區連接到vnode,並在較低級別,可能是inode。它由文件擁有,而不是描述符。如果內存可用,它可能會保持很長時間。

在套接字的情況下,流,但不是一個特定的描述符,實際上確實擁有它擁有的緩衝區。

+0

謝謝。正如別人在另一個問題中提到的,這可能會因操作系統的不同而有所不同,但是通常底層文件系統的整個塊都會單獨進行緩衝,並且每個緩衝區塊在許多讀者/作者可能正在訪問的文件中共享。這聽起來有點像它自己的迷你分頁系統,當寫入時單個塊緩衝區會被標記爲髒。很高興知道套接字,儘管我主要對「常規」文件感到好奇。 – Jegschemesch 2011-03-05 06:13:18

0

如果文件在阻塞模式下打開,那麼應該只有一個緩衝區。我敢打賭,由於性能的原因,默認值是非阻塞的。

相關問題