如果在“同步”之前关闭设备会怎样?

时间:2018-11-05 08:18:19

标签: c linux data-synchronization

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

这可以由文件系统不同步引起吗?这实际上是一个双面问题:

  1. 文件的创建及其内容的副本是否发生在不同的阶段? (允许一个阶段,只要存在一个0字节的文件)
  2. 我是否有可能“看到”文件 [表示我已成功管理cat "my_file.txt"] ,但实际上,我看到的是一个缓存版本,该版本在重启后将不再存在,除非将调用sync ,“不存在”是指内容,因为文件本身仍然存在

BTW,Linux何时刷新文件系统?我知道,例如,在引入stdout时,"\n"会被刷新(默认情况下)[并且可以通过某种方式进行配置,不记得具体如何]。文件系统也有规则吗?

3 个答案:

答案 0 :(得分:1)

  
      
  1. 文件的创建及其内容的副本是否发生在不同的阶段? (允许一个阶段,只要存在一个0字节的文件)
  2.   

是的,复制文件不是原子操作,因为您首先调用open(),然后在...之后以write()模式打开将创建一个空文件,因此依次调用O_CREAT :首先是一个空文件,然后填充。

  
      
  1. 我是否有可能“看到”该文件[这意味着我成功管理了“ my_file.txt”文件],但实际上看到的是已缓存   重启后将不会存在的版本,除非将进行同步   叫? “不存在”是指内容,如文件本身   遗物
  2.   

是的,您看到的是以前操作的缓存版本。

  

Linux何时刷新文件系统?

一般规则是内核在需要时会刷新内容。您唯一可以做的就是要求刷新,但是,即使这只是一个询问,并不意味着刷新已发生,而只是意味着刷新将很快发生。相应的命令行为sync

  

文件系统也有规则吗?

您可以挂载一个文件系统,请求以直接模式进行IO,也可以逐个文件地请求它(请参阅O_DIRECTopen中的类似内容)。但是请注意,直接模式通常会降低性能……

答案 1 :(得分:0)

  

文件的创建及其内容的副本是否发生在不同的阶段? (允许存在0字节文件的阶段)

是的。对文件的常规操作是

  1. 打开/创建文件
  2. 读取/写入数据。
  3. 关闭文件。
  

我是否有可能“看到”该文件[这意味着我成功管理了“ my_file.txt”文件],但实际上,我看到的是一个缓存版本,该版本在重启后将不再存在,除非进行同步叫吗?

是的。如果上面的步骤1已同步到硬盘驱动器,但步骤2没有同步,则会丢失文件内容。

  

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

不,没有通用规则-这很复杂。操作系统/内核和文件系统将数据缓存在RAM中,并在内部算法认为是时候这样做时将其写入磁盘。

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

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

答案 2 :(得分:-1)

如果在项目中使用文件时关闭设备,则该文件可能会被破坏,因为例如您要擦除文件的文档并再次写入文件。在这两个阶段之间,如果设备关闭,您的文件销毁。