我无法找到命名管道是否缓冲,因此问题.
该联机帮助页说https://linux.die.net/man/3/mkfifo:
A FIFO special file is similar to a pipe … any process can open it for reading or writing, in the same way as an ordinary file.
管道没有缓冲,不需要冲洗.但在普通文件中,我会fflush(或fsync)文件描述符.
命名管怎么样?
解决方法:
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.
标签:linux,pipe,fflush 来源: https://codeday.me/bug/20190731/1587393.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。