【发布时间】:2021-07-26 01:00:41
【问题描述】:
我需要在写入文件时对其进行备份。正在运行的程序会定期将数据附加到文件中,而另一个应用程序会将内容复制到备份文件中。
我的方法:备份程序每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, buf, chunksize, current_offset);
// Data retrieved
if(bytes_in > 0) {
pwrite(fd_out, buf, bytes_in, current_offset);
current_offset += bytes_in;
}
sleep(5);
}
【问题讨论】:
-
关于:
fd = open_file(); while(!done) { do_some_work(); write(fd, buf, bufsize); }这永远不会设置done变量。 -
对
write()的调用将数据放入输出流缓冲区。只有当缓冲区溢出时,数据才会真正写入文件。建议在每次调用write()后使用fflush(),以便将数据立即传递到文件中。