今天调试程序,在做异常断电测试时,再开机发现文件是0 kb, 通过log查询,文件已经写入完成。不明白为何掉电之后文件就没了。 查到下面的博文解决了该问题。 通过 fflush->fsync->fclose解决该问题
一、问题描述
Linux系统,嵌入式程序开发。
程序运行过程中,有读写配置文件保存当前位置信息的操作。在程序运行过程中突然断电,或者异常终止程序,就会出现配置文件内容出错(内容清空)或者文件直接损坏而无法打开的情况。文件损坏时,可能报出segmentation fault的错误,以致程序没法正常运行。
二、问题分析
断电瞬间正在往磁盘写文件。
内容丢失:Linux为延迟写(delayedwrite),突然断电时,文件缓冲区中数据还未写入文件
文件损坏:文件系统内部结构不一致,导致文件系统破坏。
三、解决方法
三个方案, 时间紧的朋友可以直接看方案二。
方案一:我们自己在程序中先退出去,而不能让系统强制杀掉我们的程序。
在C程序中加入SIGINT响应函数,保证程序正常退出。
(1)Linux中的kill命令,会导致写文件失败。
大部分的程序都需要一个handler来应对SIGINT信号。只有正常退出,才能做到flush,保证写文件成功。
“Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止&#x