创建文件,写入文件然后读取文件时会发生什么?

时间:2018-12-29 23:22:08

标签: posix

这是场景:

  • 打开一个新文件进行写入(即创建)
  • 执行多次写入
  • 打开相同文件进行读取(使用文件名)
  • 使用第二个文件句柄读取

因此该文件已创建并写入,但未刷新或关闭。

对于POSIX / Linux ...

我假设第二个open句柄返回的句柄可用于读取写入第一个open句柄的内容。是吗?

第二次打开还会引起冲洗吗?

2 个答案:

答案 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()指定的数据   直到该字节位置再次被修改。

对于第二个问题,不需要刷新...编写的所有内容都在内核手中,因此,如果标准要求,则任何读取都可以访问它。刷新通常用于将数据从用户空间缓冲区推送到内核空间(或手中的东西)。现在,如果您的意思是刷新到磁盘,则无需这样做...