Linux 系统断电导致文件末尾出现NULL符合问题
前言:
笔者最近配合别人弄了个日志给到他分析他的模块问题,但最近发送日志给到他调试时对方反馈说最近的日志怎么用分析工具打不开,以前不会有这个问题,打开了日志分析了一下发现文件的末尾有一行NULL,这是为什么呢?之前可以现在又不行?
(问题)
(日志出现问题的地方)
寻找问题
我开始尝试复现此问题,发现我手动结束程序的时候不会出现问题,而当我系统断电之后就必现此情况甚至偶现日志变为0的情况,难道是没有保存导致的,但是我检查了一下代码我是有调用fflush来写入的,很纳闷,试了几张情况都没有用还是一样的问题,于是开始去跟之前可以正常使用的代码来做对比,也没找到问题,后面发现就两者的区别是存储的位置不一样,之前是快速给到验证的所以直接存储到了接入系统的SD卡中,而我现在把日志改到系统里面存储了,这也会影响吗?进行了验证后还真是,改到sd卡就可以了,于是就开始疯狂的百度查找问题,找到了如下两篇参考的。
https://lwn.net/Articles/322823/
https://segmentfault.com/a/1190000019422463
原来是文件系统的格式导致的,我使用的是ext4的文件系统,而ext4是文件系统特性就是会存在这样的问题,为了保持性能不会一直去写入,等待一段时间后再写入,就会带来这个问题,而我使用的c的fflsuh也无法避免这个问题,于是查看一下文件系统格式。
(文件系统格式)
sd卡是fuseblk格式的,所以就不会有这个问题,看了参考链接的解决方法,有个作者是直接牺牲性能来保证文件的安全,但我的是嵌入式设备无法接收这种,有没有只写我的日志的办法呢?
解决方法是不要使用fopen、fwrite等操作,改为open、write等操作来写数据,直接写入到磁盘中,并在写完一次后调用fdatasync函数来确保文件的数据写入到磁盘中,这样就可以解决了,重新验证后问题得到解决,完美,记录一下,也是给各位朋友们开发提个醒。
在 C 语言中,可以使用
fsync
和fdatasync
函数来确保文件的数据和元数据被写入到磁盘。这两个函数是 POSIX 标准定义的系统调用,用于控制文件系统缓冲区的刷新,以确保数据持久化。fsync
和fdatasync
的区别在于:
fsync
函数确保文件的数据和元数据都被写入到磁盘,包括文件内容、大小、权限、时间戳等。这可能会导致磁盘的性能开销,因为它需要刷新所有文件的元数据。fdatasync
函数只确保文件的数据被写入到磁盘,而不包括文件的元数据。这意味着fdatasync
的性能开销可能比fsync
更小,因为它不需要刷新文件的元数据。
在这个示例中,我们使用了open
函数打开文件,然后使用write
函数向文件中写入数据。接着,我们调用fdatasync
函数确保文件的数据被写入磁盘,最后使用close
关闭文件描述符。
需要注意的是,fsync
和fdatasync
都是系统调用,因此其行为可能会受到操作系统和文件系统的影响。在使用这些函数时,需要确保了解其在特定操作系统和文件系统下的行为和限制。
示例代码如下:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
// 写入数据到文件
write(fd, "Hello, fsync!", 13);
// 确保文件的数据被写入磁盘
fdatasync(fd); // 或者使用 fsync(fd);
close(fd);
return 0;
}
- 分享
- 举报
-
浏览量:843次2024-02-22 13:54:49
-
浏览量:3511次2020-04-27 16:58:40
-
浏览量:5728次2020-04-22 13:48:27
-
浏览量:1205次2024-01-02 16:12:05
-
浏览量:1995次2020-08-17 18:03:03
-
浏览量:2314次2020-08-28 15:08:37
-
浏览量:3199次2021-12-04 14:07:38
-
浏览量:1125次2024-07-12 09:09:22
-
浏览量:1677次2018-04-12 15:32:47
-
浏览量:3395次2017-11-16 11:37:49
-
浏览量:1217次2023-08-10 14:03:57
-
浏览量:2115次2018-01-02 16:20:58
-
浏览量:1488次2020-05-29 16:43:24
-
浏览量:947次2023-11-01 11:14:28
-
浏览量:2175次2017-12-15 16:32:59
-
浏览量:1735次2020-08-07 16:54:02
-
浏览量:7273次2020-07-17 15:42:06
-
浏览量:2726次2020-07-07 09:24:18
-
浏览量:924次2023-12-22 10:53:00
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
毛巾卷
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明