C 如果我在“之前”关闭设备会发生什么;同步;?

C 如果我在“之前”关闭设备会发生什么;同步;?,c,linux,data-synchronization,C,Linux,Data Synchronization,我有一个嵌入式设备(Linux+BusyBox),在上面我加载了一个文件“my_file.txt”。我用cat检查了文件的内容,结果令人满意。然后,我拔下插头,重新启动后,我看到文件仍然存在,但大小为0字节 这可能是由于文件系统不同步造成的吗?这实际上是一个双面问题: 文件的创建和内容的复制是在不同的阶段进行的吗?(允许在存在0字节的文件时进行阶段删除) 我是否可能“看到”该文件[意味着我成功地管理了cat“my_file.txt”],但我实际看到的是一个缓存版本,它在重新启动后不会出现,除非调

我有一个嵌入式设备(Linux+BusyBox),在上面我加载了一个文件
“my_file.txt”
。我用
cat
检查了文件的内容,结果令人满意。然后,我拔下插头,重新启动后,我看到文件仍然存在,但大小为0字节

这可能是由于文件系统不同步造成的吗?这实际上是一个双面问题:

  • 文件的创建和内容的复制是在不同的阶段进行的吗?(允许在存在0字节的文件时进行阶段删除)
  • 我是否可能“看到”该文件[意味着我成功地管理了
    cat“my_file.txt”
    ],但我实际看到的是一个缓存版本,它在重新启动后不会出现,除非调用
    sync
    ?我所说的“不在那里”是指内容,因为文件本身仍然存在

  • 顺便说一句,Linux什么时候刷新文件系统?我知道,例如,
    stdout
    在引入
    “\n”
    时(默认情况下)会被刷新[并且可以以某种方式进行配置,但不记得具体是如何配置的]。文件系统也有规则吗?

    如果您在项目中处理文件时关闭设备,它可能会销毁您的文件,例如,您希望删除文件的文档并再次写入。我的设备在这两个阶段和文件销毁之间关闭

    文件的创建和内容的复制是在不同的阶段进行的吗?(允许存在0字节文件的阶段)

    对。对文件的正常操作是

  • 打开/创建文件
  • 读/写数据
  • 关闭文件
  • 我是否可能“看到”了文件[意味着我成功地编辑了“my_file.txt”],但我实际看到的是一个缓存版本,在重新启动后不会出现,除非调用同步

    对。如果上面的步骤1已同步到硬盘,但步骤2未同步,则会丢失文件内容

    顺便说一句,Linux什么时候刷新文件系统?例如,我知道在引入“\n”时(默认情况下)会刷新stdout[并且可以以某种方式进行配置,但不记得具体是如何配置的]。文件系统也有规则吗

    不,没有一般规则——很复杂。OS/内核和文件系统将数据缓存在RAM中,并在其内部算法认为现在是这样做的好时机时将其写入磁盘

    请注意,在许多级别上都有刷新/同步。您所说的“当引入“\n”时”刷新只是从程序到操作系统的刷新。然后,操作系统可能只将数据保存在RAM中,然后将其刷新到硬盘驱动器中。 硬盘甚至可能将其缓存在硬盘上的RAM中,并在以后将其写入永久存储器

    通常,您可以在命令行上运行
    sync
    命令,以确保所有缓存数据都从操作系统写入硬盘。(尽管在低端硬盘驱动器上的板载RAM没有电池备份,但如果断电,仍可能丢失驻留在硬盘驱动器板载RAM中的数据)

  • 文件的创建和内容的复制是在不同的阶段进行的吗?(允许在存在0字节的文件时进行阶段删除)
  • 是的,复制文件不是一个原子操作,因为您首先调用
    open()
    ,然后在。。。使用
    O_create
    模式打开将创建一个空文件,因此是:首先创建一个空文件,然后填充

  • 是否可能我“看到”了文件[意味着我成功地编辑了“my_file.txt”],但我实际看到的是一个缓存文件 重新启动后将不存在的版本,除非需要同步 打电话?我所说的“不在那里”是指内容,就像文件本身一样 遗骸
  • 没错,您看到的是以前操作的缓存版本

    Linux何时刷新文件系统

    一般规则是,内核在需要时刷新内容。你唯一能做的就是要求冲水,但唉,即使这只是一个要求,并不意味着冲水发生了,它只是意味着冲水很快就会发生。相应的命令行是
    sync

    文件系统也有规则吗


    您可以挂载一个文件系统,请求在直接模式下创建IOs,也可以逐个文件请求它(请参阅
    O_direct
    open
    中的alikes)。但是请注意,直接模式通常会降低性能…

    我认为这并不能真正回答问题。可能值得一提的是
    fsync
    fdatasync
    ,这是一个程序员的界面,用于确保文件的数据实际上被写入存储。@that otherguy纯
    sync
    -这就是我试图使用的?
    sync
    是一个可以运行的命令(或程序可以调用的函数),用于将整个系统中的所有文件同步到底层存储
    fsync/fdatasync
    是程序可以调用的函数,例如在关闭文件之前调用,以确保单个文件的数据同步到基础存储
    fsync/fdatasync
    在一个打开的文件上运行,
    sync
    在所有文件上运行。Linux和其他POSIXy/UNIXy系统中的规则并不十分复杂:“当它认为合适时,强制执行,或卸载文件系统”。“当它认为合适的时候”是复杂的,但无论如何,任何人都不应该依赖那个部分。Linux中正确的基于软件的关机可以做很多事情,包括告诉硬盘驱动器关机,以确保数据完整性。用户应该使用这一点,而不是在拔出插头应该是安全的时候找到经验法则。我投票将这个问题作为离题题来结束,因为它与编程无关,最好在unix.stackexchange.com/questions/tagged/linux上提供。为什么这不是一个编程问题?我本质上是问函数
    s