起语:
版权声明: 腾讯课堂->奇牛学院.
我只是用来方便学习 && 复习!!! 我只是一个学习者, 内功有限, 大家看到谨慎参考!!! 我建议多看官方文档.
解决之道
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#define TOTAL 10
int main(int argc, char *argv[])
{
const char *TEXT = "This is a test.\n";
const char *filename = "./write.txt";
int fd = -1;
int i = 0;
fd = open(filename, O_RDWR|O_TRUNC|O_CREAT);
if (fd < 0)
{
fprintf(stderr, "fopen %s failed, reason: %s. \nexit.\n", filename, strerror(errno));
return -1;
}
for (i = 0; i < TOTAL; i++)
{
//sleep(1);
if (writeToFile(fd, TEXT, strlen(TEXT)) < 0)
{
fprintf(stderr, "write to %s failed, reason: %s. \nexit. \n", filename, strerror(errno));
}
printf(" %d\n", i+1);
}
printf(" finished. \n");
int ret = fsync(fd);
if (ret) fprintf(stderr, "write failed. reason: %s\n", strerror(errno));
printf("Start to sleep 30 seconds .......\n");
sleep(30);
close(fd);
return 0;
}
int writeToFile(int fd, char *buf, int len)
{
int wlen = 0;
if (wlen = write(fd, buf, len) < 0)
{
fprintf(stderr, "write to %d failed. reason: %s \n", fd, strerror(errno));
return -1;
}
//fsync(fd); 这样子影响效率问题, 每次写一点就调用 fsync(), 但是磁盘的存储单位是块, 因此并不好!
return wlen;
}
具体操作
#利用这30秒来模拟宕机
#再开机
测试 ok
结语:
时间: 2020-08-20