1. 问题:
因为需要写一个非常重要的文件,需要避免因系统突然断电造成的文件内容丢失问题的发生。
而在调用了fopen/fwrite以及sync之后,会导致系统运行过程中用户操作卡一下。
原因是sync会将buffer中所有已修改数据写入磁盘中,
如果数据量大比如会影响到系统性能。
所以考虑使用fsync来sync这一个文件。
2. 问题:
使用fsync就必须先获取文件描述符,这样才能sync指定的文件。
而代码中基本上都是使用的fopen/fwrite/fclose这些c library函数,
这样函数操作的是文件指针。
所以不知道如何拿到文件描述符?
如果要改用open/write等系统调用的话,就会需要改很多代码,很麻烦。
怎么办呢?
还好有这样一个函数,它能根据输入的文件指针参数来获取该文件的文件描述符,
使得问题迎刃而解。
#include <stdio.h>
int fileno(FILE *stream);
以下是常用的文件操作类c library函数:
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
int fclose(FILE *fp);
以下是文件操作类的系统调用函数:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const char *buf, size_t count);
int close(int fd);
int fsync(int fd);
int fdatasync(int fd);
关于这些库函数和系统调用的详细信息,此时就不多做介绍了;
如果有需要,查看用户手册即可。