ARM Embedded Linux (AM335x),掉电后删除文本文件内容

Posted

技术标签:

【中文标题】ARM Embedded Linux (AM335x),掉电后删除文本文件内容【英文标题】:ARM Embedded Linux (AM335x), Text File Contents Deleted After Power Off 【发布时间】:2016-11-02 08:52:42 【问题描述】:

内核:3.12.30-AM335x-PD15.2.1(由 PHYTEC 提供)

我的应用程序需要在运行时编辑一个文本文件,并在下次开机时使用它的内容。所以我创建了一个文本文件,在其中我使用我用 QT C++ 编写的程序编写了一个简单的文本“禁用”或“启用”。

我意识到,在程序写入简单文本后,如果我在 bash 上使用命令“rebo​​ot”,并等待程序重新启动,然后再关闭系统电源(通过拔掉电缆),“ cat TextFile.txt”命令产生“启用”或“禁用”,以程序最后一次正确写入为准。

但是,如果我不重新启动并立即关闭系统电源,然后再次打开电源,则文本文件仍然存在,但内容被删除,因此“cat TextFile.txt”不会产生任何结果。

我尝试使用以下方法手动执行相同操作:

方法一:

echo Disable > TextFile.txt
reboot
.....wait for it to reboot
cat TextFile.txt

The results is "Disable".

方法二:

echo Disable > TextFile.txt
.. power off by plugging off the cable
.. power on the system
cat TextFile.txt

No resulting text..

我只是不想为了保存文件而重新启动系统。所以我很乐意在我的 QT C++ 程序中执行命令来保存所有内容而无需重新启动;但是我不太了解操作系统,因此我不知道我应该做什么才能做到这一点。

顺便说一下,这是我的代码:

QFile file(filename);
    // Trying to open in WriteOnly and Text mode
    if(!file.open(QFile::WriteOnly |
                  QFile::Text))
    
        qDebug() << " Could not open file for writing";
    

    // To write text, we use operator<<(),
    // which is overloaded to take
    // a QTextStream on the left
    // and data types (including QString) on the right

    QTextStream out(&file);
    out << "Enable";
    file.flush();
    file.close();

【问题讨论】:

拔掉电脑上的插头导致数据丢失不足为奇。就如何使用Linux而言,重启基本上是一种非常昂贵的运行sync的方式。 【参考方案1】:

正如您在 shell 上的实验表明,这不是严格意义上的 c++ 或 Qt 问题,文件只是没有立即写入磁盘。

系统设置可能使用延迟写入来优化磁盘访问时间,即先写入内存缓冲区,然后每隔一段时间写入实际磁盘。

如果您有其他程序在写入文件并预计断电是一种现实情况,您可能需要对其进行调整。

现在,对于有问题的 Qt 程序,您可以尝试使用QSaveFile 而不是QFile,它的commit() 要求系统实际同步到磁盘。

【讨论】:

我该如何调整它?我真的需要最多在 1 分钟内保存文件。我现在就试试 QSaveFile。 QSaveFile 效果很好,正是我所需要的,谢谢:) 用于调整:这取决于使用的文件系统:通常通过挂载选项,但有些可能需要在内核构建时设置值

以上是关于ARM Embedded Linux (AM335x),掉电后删除文本文件内容的主要内容,如果未能解决你的问题,请参考以下文章

为 arm 编译 qwt

嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)

如何进行基于am335的boa移植?

8188EU 在AM335X MC183上以AP+STA工作

am335x内核初始化路径

am335x uboot 点亮LED