如何解决并发写入和读取文件
我需要在写入文件时对其进行备份。一个正在运行的程序周期性地将数据附加到一个文件中,另一个应用程序将内容复制到一个备份文件中。
我的方法:备份程序每 x
秒唤醒一次,并从原始文件中的前一个偏移量发出 pread
字节的 y
请求。如果 pread 调用返回一个表示检索到的字节数的正整数,我会将它们写入备份文件。
这种方法会导致备份文件不一致吗?是否有可能 pread 调用读取了一块未完全写入原始文件的数据?请注意,数据仅附加到原始文件中。初步测试表明这种方法工作正常,但可能是偶然的。
编写器代码:
fd = open_file();
while(!done) {
do_some_work();
write(fd,buf,bufsize);
}
读者代码:
fd_in = open_original_file();
fd_out = open_backup_file();
while(!done) {
// Issue a read call
bytes_in = pread(fd_in,chunksize,current_offset);
// Data retrieved
if(bytes_in > 0) {
pwrite(fd_out,bytes_in,current_offset);
current_offset += bytes_in;
}
sleep(5);
}
解决方法
是的,它应该是安全的。 POSIX I/O 保证顺序一致性;也就是说,对同一文件的并发访问将完成,就好像它们以某种顺序执行一样。写入是原子的;一次读取只能读取完全写入的数据。
一些网络文件系统削弱了顺序一致性要求,但我怀疑它们是否违反了写入的原子性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。