我找不到命名管道是否被缓冲,因此问题。
手册页说https://linux.die.net/man/3/mkfifo:
FIFO 特殊文件类似于管道……任何进程都可以打开它进行读取或写入,就像普通文件一样。
管道没有缓冲,不需要刷新。但是在普通文件中,我会刷新(或 fsync)文件描述符。
命名管道怎么样?
管道没有缓冲,不需要刷新。
我实际上是反过来说的:对于大多数意图和目的,管道只不过是缓冲区。刷新它们没有意义,因为没有底层设备来接收数据。
此外,虽然 POSIX 没有明确禁止管道 I/O 的额外缓冲,但它确实提出了足够的行为要求,我认为没有任何方法可以通过观察来确定这种缓冲是否发生,除非可能通过是否fsync()成功。换句话说,即使有额外的缓冲,也不需要fsync()管道末端。
但是在普通文件中,我会刷新(或 fsync)文件描述符。
好吧,不,你不会fflush()是文件描述符。 fflush()操作由对象表示的流,而FILE不是文件描述符。这是一个至关重要的区别,因为大多数流都在 C 库级别进行缓冲,与底层文件的性质无关。fflush()与之交互的正是这个库级缓冲区。您可以通过该setvbuf()函数控制流的库级缓冲模式。
在提供它的那些系统上,fsync()在不同的、较低的级别上运行。它指示操作系统确保之前写入指定文件描述符的所有数据都已传送到底层存储设备。换句话说,它刷新操作系统级缓冲区。
请注意,您可以通过该fdopen()函数将流包裹在管道端文件描述符周围。这不会使管道比以前更需要刷新,但默认情况下流将被缓冲,因此刷新将与其相关。
另请注意,某些存储设备执行自己的缓冲,因此即使在数据已移交给存储设备之后,也不能确定它们是否立即持久化。
命名管道怎么样?
上面关于流 I/O与. 基于 POSIX 描述符的 I/O 也适用于此。如果您通过流访问命名管道,那么它与它的交互fflush()将取决于该流的缓冲。
但我想你的问题更多是关于操作系统级缓冲和刷新。POSIX 似乎没有具体说明,但是由于您在问题中标记了 [linux] 并参考了 Linux 手册页,因此我提供了以下回复:
管道和 FIFO 之间的唯一区别是它们的创建和打开方式。完成这些任务后,管道和 FIFO 上的 I/O 具有完全相同的语义。
| 归档时间: |
|
| 查看次数: |
5409 次 |
| 最近记录: |