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