【发布时间】:2023-03-28 01:59:01
【问题描述】:
在查看libstd++(GNU CC 4.9.2)中basic_filebuf 的实现时,我遇到了__basic_file 类,但我无法理解其设计原理。具体来说:
-
__basic_file::open使用 C stdio 实现fopen -
__basic_file::sync使用 C stdio 实现fflush - 所有其他方法都是使用系统调用实现的(例如
read、write、lseek)
我知道为什么 I/O 是使用系统调用来执行的(filebuf / streambuf 实现了它们自己的缓冲)但是为什么要首先使用 C stdio 打开文件?
为什么要刷新sync 中的stdio 缓冲区(这不会潜在地引入一些奇怪的边缘情况)?例如,如果由于某种原因 fwrite 除了执行 C++ 流写入外还被客户端代码调用,则可能不遵守写入顺序(即发生filebuf 写入,发生fwrite 但不会填充标准输入输出缓冲区并实际输出任何内容,filebuf 再次写入,sync 被显式或隐式调用...然后fwrite 数据将最后写入 - 我意识到这是一个人为的例子,但理论上可能)。
【问题讨论】:
-
请在您的问题中添加您能想到的任何边缘情况。这将提高问题的质量。
-
@R Sahu:我添加了一个有些人为的例子,尽管“边缘情况”不是问题的重点。
-
这可能是不鼓励混合 stdio 和 C++ 流的原因之一。