一个文件上的O_APPEND标志使read()系统调用在其他文件上表现得很奇怪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个文件上的O_APPEND标志使read()系统调用在其他文件上表现得很奇怪相关的知识,希望对你有一定的参考价值。

我有一个C程序,它在目录中创建指定数量的文件(name-myfiles)。然后删除所有文件。然后创建一个非常大的文件(名称-appfile),追加它,截断它。在循环中执行几轮上述操作。

为了验证每个write,我从相同的偏移量读取目标文件,在那里它已经写入了数据。如果测试不对大文件使用O_APPEND标志,则此验证部分(read())非常顺利。但是,否则,读取开始显示奇怪的行为。完成第一轮测试后,读取的字节数为0或小于缓冲区大小或者如果字节数等于缓冲区大小,则两个缓冲区的内容不匹配。

答案

鉴于destflg=O_RDWR | O_APPEND | O_CREAT;,我假设有两件事:

  1. 您正在追加模式下打开文件
  2. 你在Linux上运行。

Linux上的pwrite()已经崩溃了。

来自the Linux pwrite() man page

BUGS

POSIX要求使用O_APPEND标志打开文件应该对pwrite()写入数据的位置没有影响。但是,在Linux上,如果使用O_APPEND打开文件,pwrite()会将数据附加到文件的末尾,而不管offset的值是多少。

以上是关于一个文件上的O_APPEND标志使read()系统调用在其他文件上表现得很奇怪的主要内容,如果未能解决你的问题,请参考以下文章

看表情包学Linux初识文件描述符 | 虚拟文件系统 (VFS) 初探 | 系统传递标记位 | O_TRUNC | O_APPEND

APUE习题3.6

如何在 C# 中进行原子写入/追加,或者如何使用 FILE_APPEND_DATA 标志打​​开文件?

Linux应用开发:文件IO进阶

Linux中文件I/O函数

Linux fcntl函数设置阻塞与非阻塞