Linux 系统断电导致文件末尾出现NULL符合问题

Linux 系统断电导致文件末尾出现NULL符合问题 毛巾卷 2023-12-08 16:50:26 271

前言:

笔者最近配合别人弄了个日志给到他分析他的模块问题,但最近发送日志给到他调试时对方反馈说最近的日志怎么用分析工具打不开,以前不会有这个问题,打开了日志分析了一下发现文件的末尾有一行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 语言中,可以使用 fsyncfdatasync 函数来确保文件的数据和元数据被写入到磁盘。这两个函数是 POSIX 标准定义的系统调用,用于控制文件系统缓冲区的刷新,以确保数据持久化。
fsyncfdatasync 的区别在于:

  • fsync 函数确保文件的数据和元数据都被写入到磁盘,包括文件内容、大小、权限、时间戳等。这可能会导致磁盘的性能开销,因为它需要刷新所有文件的元数据。
  • fdatasync 函数只确保文件的数据被写入到磁盘,而不包括文件的元数据。这意味着 fdatasync 的性能开销可能比 fsync 更小,因为它不需要刷新文件的元数据。
    在这个示例中,我们使用了 open 函数打开文件,然后使用 write 函数向文件中写入数据。接着,我们调用 fdatasync 函数确保文件的数据被写入磁盘,最后使用 close 关闭文件描述符。
    需要注意的是,fsyncfdatasync 都是系统调用,因此其行为可能会受到操作系统和文件系统的影响。在使用这些函数时,需要确保了解其在特定操作系统和文件系统下的行为和限制。

示例代码如下:

#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;
}
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 1 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
毛巾卷
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区