这是场景:
因此该文件已创建并写入,但未刷新或关闭。
对于POSIX / Linux ...
我假设第二个open句柄返回的句柄可用于读取写入第一个open句柄的内容。是吗?
第二次打开还会引起冲洗吗?
答案 0 :(得分:1)
我认为我已经根据“ POSIX I / O的语义”发现了应该发生的情况,即每次写入后都保证已提交数据,因此任何后续的打开/读取都将看到之前所有写入的数据。
以下是关于规范的评论:
“也就是说,写入必须保持高度一致-也就是说,在系统可以保证任何其他read()调用将看到刚刚写入的数据之前,都必须使用write()来阻止应用程序执行”(参考: https://www.nextplatform.com/2017/09/11/whats-bad-posix-io/)
这引起了一个问题,如果每次写入都在返回之前提交数据,则flush()的目的是什么?我发现这似乎是对我的误解-因为POSIX具有fflush()(不是flush),而fflush()适用于流而不是文件。
仅供参考,我感到困惑是因为我假设FUSE运算符映射到POSIX文件操作,而FUSE确实有一个flush运算符。所以我想FUSE不一定是POSIX兼容的wrt write()吗?这样做是有道理的,可以允许某些FUSE实现在不提交数据的情况下(例如出于性能原因)在提交数据之前返回。我正在猜测,因此对此表示任何赞赏。
答案 1 :(得分:1)
POSIX手册回答了第一个问题:
对常规文件的
write()
成功返回后:文件中每个字节位置的任何成功
read()
通过该写操作修改的结果应返回write()
指定的数据 直到该字节位置再次被修改。
对于第二个问题,不需要刷新...编写的所有内容都在内核手中,因此,如果标准要求,则任何读取都可以访问它。刷新通常用于将数据从用户空间缓冲区推送到内核空间(或手中的东西)。现在,如果您的意思是刷新到磁盘,则无需这样做...