C 如果我在“之前”关闭设备会发生什么;同步;?
我有一个嵌入式设备(Linux+BusyBox),在上面我加载了一个文件C 如果我在“之前”关闭设备会发生什么;同步;?,c,linux,data-synchronization,C,Linux,Data Synchronization,我有一个嵌入式设备(Linux+BusyBox),在上面我加载了一个文件“my_file.txt”。我用cat检查了文件的内容,结果令人满意。然后,我拔下插头,重新启动后,我看到文件仍然存在,但大小为0字节 这可能是由于文件系统不同步造成的吗?这实际上是一个双面问题: 文件的创建和内容的复制是在不同的阶段进行的吗?(允许在存在0字节的文件时进行阶段删除) 我是否可能“看到”该文件[意味着我成功地管理了cat“my_file.txt”],但我实际看到的是一个缓存版本,它在重新启动后不会出现,除非调
“my_file.txt”
。我用cat
检查了文件的内容,结果令人满意。然后,我拔下插头,重新启动后,我看到文件仍然存在,但大小为0字节
这可能是由于文件系统不同步造成的吗?这实际上是一个双面问题:
cat“my_file.txt”
],但我实际看到的是一个缓存版本,它在重新启动后不会出现,除非调用sync
?我所说的“不在那里”是指内容,因为文件本身仍然存在顺便说一句,Linux什么时候刷新文件系统?我知道,例如,
stdout
在引入“\n”
时(默认情况下)会被刷新[并且可以以某种方式进行配置,但不记得具体是如何配置的]。文件系统也有规则吗?如果您在项目中处理文件时关闭设备,它可能会销毁您的文件,例如,您希望删除文件的文档并再次写入。我的设备在这两个阶段和文件销毁之间关闭
文件的创建和内容的复制是在不同的阶段进行的吗?(允许存在0字节文件的阶段)
对。对文件的正常操作是
sync
命令,以确保所有缓存数据都从操作系统写入硬盘。(尽管在低端硬盘驱动器上的板载RAM没有电池备份,但如果断电,仍可能丢失驻留在硬盘驱动器板载RAM中的数据)
open()
,然后在。。。使用O_create
模式打开将创建一个空文件,因此是:首先创建一个空文件,然后填充
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