在 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;
}
請注意,這些替代方案可能會影響程序的性能,因為它們會立即將數據刷新到磁盤。在選擇替代方案時,請根據您的需求進行權衡。