在 Linux 系统中,fflush()
函数用于刷新输出流(如文件或管道)的缓冲区
fsync()
函数:fsync()
函数可以确保文件描述符关联的文件数据和元数据被刷新到磁盘。这对于需要确保数据完整性的场景非常有用。请注意,fsync()
仅适用于文件描述符,而不是文件指针。因此,您需要使用 fileno()
函数从文件指针获取文件描述符。
示例:
#include<stdio.h>
#include <unistd.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("fopen");
return 1;
}
fprintf(file, "Hello, World!\n");
int fd = fileno(file);
if (fd == -1) {
perror("fileno");
return 1;
}
if (fsync(fd) == -1) {
perror("fsync");
return 1;
}
fclose(file);
return 0;
}
_POSIX_SYNCHRONIZED_IO
选项:如果您的系统支持 POSIX 同步 I/O,您可以在打开文件时设置 _POSIX_SYNCHRONIZED_IO
选项。这将导致所有对该文件的写操作都立即刷新到磁盘。
示例:
#include <fcntl.h>
#include<stdio.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_WRONLY | O_CREAT | O_SYNC, 0644);
if (fd == -1) {
perror("open");
return 1;
}
const char *message = "Hello, World!\n";
ssize_t written = write(fd, message, strlen(message));
if (written == -1) {
perror("write");
return 1;
}
close(fd);
return 0;
}
请注意,这些替代方案可能会影响程序的性能,因为它们会立即将数据刷新到磁盘。在选择替代方案时,请根据您的需求进行权衡。