Pipes are not buffered, no need to flush.
实际上我反过来说:对于大多数意图和目的,管道只不过是缓冲区.刷新它们没有意义,因为没有底层设备接收数据.
此外,虽然POSIX没有明确禁止管道I / O的额外缓冲,但它确实提供了足够的行为要求,我认为没有任何方法可以从观察中确定是否发生了这种缓冲,除非fsync()成功.换句话说,即使有额外的缓冲,也不需要fsync()管端.
But in a ordinary file, I
would fflush (or fsync) the file descriptor.
嗯,不,你不会fflush()文件描述符. fflush()对流进行操作,由FILE对象表示,而不是文件描述符.这是一个至关重要的区别,因为大多数流都在C库级别进行缓冲,与下面文件的性质无关.这是fflush()与之交互的库级缓冲区.您可以通过setvbuf()函数控制流的库级缓冲模式.
在提供它的那些系统上,fsync()在不同的较低级别上运行.它指示操作系统确保先前写入指定文件描述符的所有数据都已传送到底层存储设备.换句话说,它会刷新OS级缓冲区.
请注意,您可以通过fdopen()函数将流包装在管道末端文件描述符周围.这不会使管道需要比以前更多地进行冲洗,但是默认情况下流将被缓冲,因此冲洗将与之相关.
还要注意,某些存储设备执行自己的缓冲,因此即使数据已经传递到存储设备,也不能确定它们是否立即持久存在.
How about named pipe?
以上关于流I / O与基于POSIX描述符的I / O的讨论也适用于此.如果通过流访问命名管道,那么它与fflush()的交互将取决于该流的缓冲.
但我想你的问题更多的是os级缓冲和刷新. POSIX似乎没有说明具体的内容,但由于您在标题中标记了[linux]并引用了Linux手册页,因此我提供了以下内容:
The only difference between pipes and FIFOs is the manner in which
they are created and opened. Once these tasks have been accomplished,
I/O on pipes and FIFOs has exactly the same semantics.