C 一个文件上的O_APPEND标志使read()系统调用在其他文件上的行为异常

C 一个文件上的O_APPEND标志使read()系统调用在其他文件上的行为异常,c,file-io,posix,C,File Io,Posix,我有一个C程序,它在一个目录中创建指定数量的文件(name-myfiles)。然后删除所有文件。然后创建一个非常大的文件(名称-appfile),追加它,截断它。 上述几轮操作在一个循环中执行 为了验证每个写入,我从写入数据的相同偏移量读取目标文件。若测试并没有对大文件使用O_APPEND标志,那个么这个验证部分(read())运行得很好。但除此之外,read开始表现出奇怪的行为。完成第一轮测试后,通过读取读取的字节数为0或小于缓冲区大小,或者如果字节数等于缓冲区大小,则两个缓冲区的内容不匹配。

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


为了验证每个
写入
,我从写入数据的相同偏移量读取目标文件。若测试并没有对大文件使用O_APPEND标志,那个么这个验证部分(read())运行得很好。但除此之外,read开始表现出奇怪的行为。完成第一轮测试后,通过读取读取的字节数为0或小于缓冲区大小,或者如果字节数等于缓冲区大小,则两个缓冲区的内容不匹配。

给定
destflg=O_RDWR | O_APPEND | O_CREAT,我假设有两件事:

  • 您正在以附加模式打开文件
  • 您正在Linux上运行
  • Linux上的
    pwrite()
    已损坏

    发件人:

    错误

    POSIX要求打开带有
    O_APPEND
    标志的文件时 对
    pwrite()
    写入数据的位置没有影响。但是, 在Linux中,如果使用
    O_APPEND
    打开文件,
    pwrite()
    将数据附加到 文件的结尾,与
    偏移量的值无关


    给定
    destflg=O_RDWR | O_APPEND | O_CREAT,我假设有两件事:

  • 您正在以附加模式打开文件
  • 您正在Linux上运行
  • Linux上的
    pwrite()
    已损坏

    发件人:

    错误

    POSIX要求打开带有
    O_APPEND
    标志的文件时 对
    pwrite()
    写入数据的位置没有影响。但是, 在Linux中,如果使用
    O_APPEND
    打开文件,
    pwrite()
    将数据附加到 文件的结尾,与
    偏移量的值无关


    如果你发布了你的实际代码,那么帮助会容易得多。你写的东西最好放在代码注释中。不要描述你的代码,而是展示它。请阅读以下内容:。顺便说一句,你确定你真的需要
    pread
    而不是
    read
    在这里吗?如果你发布了你的实际代码,会更容易得到帮助。你写的东西最好放在代码注释中。不要描述你的代码,而是展示它。请阅读以下内容:。顺便说一句,你确定你真的需要
    pread
    而不是
    read
    ?O_APPEND标志只用于大文件(名为apfill)。对于最初由mytest()@NhG11创建的所有其他源文件大小的文件,验证部分都失败。如果您在Linux上运行,并且在使用
    O_APPEND
    打开的文件上使用
    pwrite()
    ,则数据会附加到文件中。这就是发生的事情吗?我意识到在循环的第一次迭代中,在创建大文件时,它使用O_APPEND修改destflg变量,并忽略将其更改回以前的值以用于其他迭代。因此,所有其他文件(将创建为稀疏文件)也会在O_追加模式下打开,这就是为什么读取超过EOF的偏移量会导致0字节,或者有时数据以错误的偏移量读取,然后不匹配。O_追加标志仅用于大文件(名为apfill)。对于最初由mytest()@NhG11创建的所有其他源文件大小的文件,验证部分都失败。如果您在Linux上运行,并且在使用
    O_APPEND
    打开的文件上使用
    pwrite()
    ,则数据会附加到文件中。这就是发生的事情吗?我意识到在循环的第一次迭代中,在创建大文件时,它使用O_APPEND修改destflg变量,并忽略将其更改回以前的值以用于其他迭代。因此,所有其他文件(将被创建为稀疏文件)也会在O_追加模式下打开,这就是为什么读取超过EOF的偏移量会导致0字节,或者有时数据以错误的偏移量读取,然后不匹配。