【问题标题】:In linux, is it possible to do partial reads on a regular file在linux中,是否可以对常规文件进行部分读取
【发布时间】:2012-11-16 20:12:11
【问题描述】:

我需要编写一个以非常快的速度将日志条目吐出到常规文件的应用程序。此外,还有另一个进程可以同时读取同一个文件,其他进程将写入它。 我有以下问题

  1. read() 如何确定 EOF,特别是在底层文件可能同时被修改的情况下?

  2. read() 是否可以从其他进程写入返回部分写入的数据?例如,写过程写了半行,读会选择那半行并返回?

应用程序将使用 Ex4 文件系统在 linux 2.6.x 上用 C 语言编写

更新: 下面的链接指向在读写之前将 inode 锁定在 EXT4 中的补丁。 http://patchwork.ozlabs.org/patch/91834/

【问题讨论】:

  • 我认为这是著名读者作家的问题,最好使用locksemaphore实现它
  • ad 2) 在 unix 中,读取和写入是原子的(至少到块级)。对于大于1块的action,我不知道文件系统是否保证了操作的顺序。
  • @wildplasser 你能指点我一些文档,上面写到一个块级别是原子的吗?
  • @wildplasser 没有这样的保证,但它在 99% 的时间里都有效,因为write() 系统调用锁定了它即将写入的 inode,因此序列化了所有写入器。在 1% 的情况下,它将是部分 write()

标签: c linux


【解决方案1】:

read() 如何确定 EOF,特别是在底层文件可能同时被修改的情况下?

当您尝试 read() 超过文件末尾时,它会返回 EOF。您仍然可以来回查找文件并再次读取(仅当文件描述符引用文件而不是管道或套接字时)。

read() 是否可以从其他进程写入返回部分写入的数据?例如,写过程写了半行,读会选择那半行并返回?

很有可能。

【讨论】:

  • 不是用 linux atomic 写的吗?
  • @Jimm 不管写入是否是块原子的,当单行跨越块边界时会发生什么?
  • @twalberg 我从来没有说过块原子。简直是原子的。事实上,你能指出我在 linux 中写入块原子的来源吗?
  • @Jimm 写入通常不是原子的。管道有特殊的原子性要求,但其他一切都没有。
  • @MaximYegorushkin:此外,写入可能会被导致部分缓冲区写入的信号中断。如果发生这种情况,读取可以获取部分写入,即使写入是原子的。好的,这可能仅适用于其他 Unix,而不适用于 Linux 和文件。但是在 Linux 上写入终端时确实会发生这种情况,因为我已经看到它并在 glibc 上提交了关于它的错误。
猜你喜欢
  • 2017-01-27
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多