【问题标题】:to keep files after kernel rebooting内核重启后保留文件
【发布时间】:2012-07-16 00:48:58
【问题描述】:

我需要使用 reboot() 系统调用(用 ARM 重新启动内核 2.6.29),我尝试了以下代码:

#include <stdio.h>
#include <linux/reboot.h>
#include <unistd.h>
int main()
{
    reboot(LINUX_REBOOT_CMD_RESTART);
}

效果很好!但我想知道的是在重新启动内核后我丢失了正在保存的文件。 我的意思是如果使用此代码,“url”文件在重新启动后不会保存。

int main()
    {
        FILE *pFile = fopen("url", "a"); // for .txt file
        // write to file/read from file ... etc
        fclose(pFile);

        int fdUART = open("/dev/ttySAC0", O_RDWR | O_NOCTTY | O_NDELAY);
        // some operations on UART port
        close(fdUART);
        /* Ethernet raw package process*/
        /* Char dev driver open and communicate with FPGA fifo */
        /* so on */
        reboot(LINUX_REBOOT_CMD_RESTART);
    }

并且正在使用 UART、以太网、char 驱动程序,只是想知道 reboot() 调用系统对我的系统的影响。

任何帮助都非常感谢。

【问题讨论】:

  • 听起来您正在写入的设备不是持久的。您很可能只是在写入 tmpfs 或其他东西。这个程序的工作目录挂载了什么?
  • 哦,是的..我忘了告诉我通过挂载将文件(“url”)写入 SDCard,但文件系统是 cramfs。并感谢您帮助我。
  • 你写了close(pFile)。那应该是fclose(pFile),因为它被声明为FILE *pFile。你确定这是你的实际代码吗?
  • 我建议调用sync(2) 和/或fsync(2) 系统调用。

标签: c linux filesystems kernel


【解决方案1】:

你在 cmets 中写过文件系统是 cramfs。

来自the Wikipedia page for cramfs

压缩的 ROM 文件系统(或 cramfs)是一个免费(GPL 版)只读 Linux 文件系统,旨在简化和节省空间。主要用于嵌入式系统和小尺寸系统。

请注意,它是只读的:这意味着您的更改不会被保留。

您需要写入持久性存储以保留您的更改。

【讨论】:

  • 是的,你是 100% 正确的,但过程是这样的:我执行程序,程序将 SD 卡挂载到 /mn/ 目录并将文件写入其中。当系统需要重新启动程序时,卸载 /mnt/ 目录并重新启动(LINUX_REBOOT_CMD_RESTART);。问题是如何保持正在写入的文件。第二个问题是程序突然重新启动内核时对内核的副作用(对 UART/以太网端口)是什么。 (ps:对不起,我想我无法解释我想问的问题。)
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 2015-04-28
  • 2012-12-29
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多