Linux 可用的文件系统示例,不保证 `write()` 返回已写入的内容后会执行 `read()`?

问题描述 投票:0回答:1

Linux write() 手册页 说:

POSIX 要求可以证明 read(2) 发生在 write() 返回后将返回新数据。请注意,并非所有 文件系统符合 POSIX 标准。

我认为它指的是

POSIX write() 页面,上面写着:

对常规文件的 write() 成功返回后:

  • 从该写入修改的文件中的每个字节位置进行的任何成功的 read() 都应返回该位置的 write() 指定的数据,直到再次修改此类字节位置。

  • 对文件中相同字节位置的任何后续成功 write() 都将覆盖该文件数据。

Linux 是否有一个不符合此规则的示例文件系统?

linux filesystems
1个回答
0
投票
  1. /proc/
     是显而易见的:
$ echo hello > /proc/564769/comm $ cat /proc/564769/comm hello $
(添加了额外的换行符)

  1. NFS:如果客户端调用

    write()

    但不调用
    fsync()
    ,并且服务器崩溃并重新启动,则来自客户端的下一个
    read()
    将返回旧数据。
    请注意,虽然 POSIX 和 Linux 手册页都没有限定其声明,但它们都假设应用程序(在本例中为客户端)不会在写入和读取之间崩溃,但对存储介质(服务器)只字未提。侧面,在这种情况下)。

  2. FUSE:FUSE 支持回写缓存模式,因此任何使用它的文件系统都容易受到与上述 NFS 服务器崩溃相同的问题,其中 FUSE 守护进程可能会崩溃。

    此外,任何人都可以编写一个仅具有非 POSIX 语义的 FUSE 文件系统,就像 procfs 一样。

© www.soinside.com 2019 - 2024. All rights reserved.