【发布时间】:2021-08-09 18:50:12
【问题描述】:
我有两个进程需要访问同一个文件。 进程 A 是一个 C 程序,它循环地将一个结构体写入 file。
int fd = open("file", O_WRONLY);
if (fd >= 0){
write(fd, &structure, sizeof(structure));
close(fd);
}
进程 B 是一个 python 程序,需要读取同一个文件,然后使用 pycstruct 对其进行解释。
如何确保进程 A 和进程 B 可以访问同一个文件而不会发生冲突?
【问题讨论】:
-
至少,对
write的调用是原子的。这意味着读取器部分,只要它尝试在单个操作中读取,将看到写入之前或之后的值,不会混合这些值。 -
你有 1 个写进程和 1 个读进程?您可以在文件头添加“版本号”,版本以“0”开头。每当编写器要更改文件时,它都会增加版本(即它在第一次访问时变为版本 1)。然后它更改内容并刷新结果。完成后,它会再次增加版本号(即在第一次更新后变为 2)。这样,ODD 版本号意味着作者当前正在更改文件的内容;偶数版本号,表示文件处于一致状态。
-
@Jean-LoupSabatier 如果写入和读取不是原子的,您的建议不能保证文件的状态。通过“首先”更新版本号,然后写入更新,然后“最后”更新版本号,您可以拆分操作,使它们成为非原子的。假设阅读器刚刚读取了标题,并且即将读取数据。作家不更新版本号并写入一些新数据的保证是什么?一点也不能解决这个问题。您需要双重读取、校验和或哈希摘要来检查文件完整性。
-
@Cheatah ,我描述的场景确实是同步的原始形式,IMO,但是如果读取器进程每次从文件中读取具有奇数版本的结构时再次读取(并读取直到它得到一个偶数版本);如果,每当你从文件中读取完你的结构时,你再次读到它仍然是与你第一次读取它时相同的版本号,我相信它保证了一致性。不过,在我编写它几个小时后考虑该方法,我意识到这是一种相当粗糙的方法。
标签: python c linux file concurrency