每个Unix文件描述符都有自己的读写缓冲区吗?

5
关于 这个问题 关于read() 和 write(),我想知道每个打开的文件描述符是否有自己的读写缓冲区,或者当一个文件同时被多次打开时,是否有一个单独的读写缓冲区。我很好奇这会对同一文件的重叠写入产生什么影响。也许这是Unix系统之间的差异吗?
(据我理解,“文件描述符”指的是关于打开文件的信息/选项,例如当前标记位置。“文件描述符”,相反,只是进程用来引用描述符的数字。)

1
我认为低级别的Unix I/O大多是未经缓冲的。但如果作为流(fopen等)打开,则会为FILE结构创建一个缓冲区。 - seand
1
@seand 根据我的理解,读写操作默认情况下都采用缓存,除非使用 O_DIRECT 打开文件。基于流的 I/O 库实际上添加了第二层缓存,这一次在进程中进行。 - Jegschemesch
2个回答

5
这有点取决于你是在谈论套接字还是实际文件。
严格来说,描述符从未拥有自己的缓冲区;它只是更深层次抽象的句柄。
文件系统对象有它们自己的缓冲区,至少在需要时。也就是说,如果程序写入的数据小于文件系统块的大小,内核就不得不读取一个FS块并将写入与现有数据合并。
这个缓冲区附加到vnode上,在较低级别可能是inode。它归文件所有而不是描述符。如果内存可用,它可能会保留很长时间。
对于套接字,流(stream)确实拥有自己的缓冲区,但不是特定的单个描述符。

谢谢。正如其他问题中的某人所说,这可能因操作系统而异,但通常整个底层文件系统块会被单独缓冲,并且每个缓冲块都会在访问文件的任何读者/写入者之间共享。它听起来有点像一个迷你分页系统,其中单个块缓冲区在写入时被标记为脏块。虽然我主要是对“常规”文件感到好奇,但了解套接字也很好。 - Jegschemesch

0

如果文件以阻塞模式打开,那么应该只有一个缓冲区。出于性能原因,我敢打赌默认情况下是非阻塞的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接