我有两个进程:一个是使用 fwrite 循环写入文件,另一个是使用 read 循环读取文件。读取器进程有时会返回正读取大小,但缓冲区中全部为 0x00,但当它尝试再次读取时,它工作正常。该文件位于网络文件系统 wekafs 上,读取过程发生在写入者仍在写入文件时(实时读取)。
这是阅读器进程的代码:
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* filename = "<my file>";
// Open the file for reading
int fd = open(filename, O_DIRECT | O_RDONLY);
if (fd < 0) {
perror("Failed to open file for reading");
return 1;
}
size_t sz = 40000;
char *read_data;
if (posix_memalign((void**)&read_data, 512, sz) != 0) {
perror("Failed to allocate aligned memory");
return 1;
}
bool loop = true;
size_t total_bytes = 0;
while (loop) {
ssize_t bytes_read = read(fd, read_data, sz);
if (bytes_read < 0) {
perror("Failed to read from file");
break;
} else if (bytes_read == 0) {
std::cout << "End of file reached." << std::endl;
break;
} else {
total_bytes += bytes_read;
std::cout << "Read " << bytes_read << " bytes, total so far: " << total_bytes << std::endl;
}
}
// Clean up
free(read_data);
close(fd);
return 0;
}
问题: 有时,当读取器尝试读取时,它会在缓冲区中得到全零,我认为这是垃圾数据。当读者再次尝试时,效果很好。 写入器不断写入文件,读取器在文件被修改的同时实时读取文件(实时读取)。 该文件位于 wekafs 网络文件系统上,我不确定问题是否与网络延迟或文件系统的缓存问题有关。
我尝试过的: 确保阅读器正确检查错误(即检查 read() 返回值)。
问题是否与网络文件系统如何处理实时读写有关,或者我在处理读写器同步时还遗漏了什么?
当您使用
fwrite
时,您的写入过程会使用缓冲IO。这意味着,应用程序缓冲区中的某些数据和 NFS 客户端本地页面缓存中的某些数据同步后,NFS 服务器将面临内存压力或关闭。但是,读取器进程使用直接 IO,从而读取 NFS 服务器上的数据。为了确保写入的数据可供客户端使用,写入进程应使用直接 IO,或调用 fflush
来同步应用程序缓冲区,然后在文件描述符上调用 fsync
将数据推送到 NFS 服务器。