Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个进程访问同一文件的文件写/读锁定机制_Python_C_Linux_File_Concurrency - Fatal编程技术网

Python 两个进程访问同一文件的文件写/读锁定机制

Python 两个进程访问同一文件的文件写/读锁定机制,python,c,linux,file,concurrency,Python,C,Linux,File,Concurrency,我有两个进程需要访问同一个文件。 进程A是一个循环将结构写入文件的C程序 进程B是一个python程序,需要读取同一个文件,然后使用pycstruct对其进行解释 如何确保进程A和进程B可以访问同一个文件而不发生冲突?通过writer进程创建一个空文件可能会有所帮助。在每次读取操作期间,可以检查文件时间戳。如果文件的时间戳早于当前读取时间,则读取进程可以读取文件内容。最后再次检查时间戳,以确保数据中没有不匹配。如果这不需要使用任何IPC机制(共享内存?)至少,对write的调用是原子的。这意味着

我有两个进程需要访问同一个文件。 进程A是一个循环将结构写入文件的C程序

进程B是一个python程序,需要读取同一个文件,然后使用pycstruct对其进行解释


如何确保进程A和进程B可以访问同一个文件而不发生冲突?

通过writer进程创建一个空文件可能会有所帮助。在每次读取操作期间,可以检查文件时间戳。如果文件的时间戳早于当前读取时间,则读取进程可以读取文件内容。最后再次检查时间戳,以确保数据中没有不匹配。如果这不需要使用任何IPC机制(共享内存?)

至少,对
write
的调用是原子的。这意味着读卡器部分,如果它尝试在单个操作中读取,将在写入之前或之后看到值,而不是值的混合?您可以在文件头中添加“版本号”,版本以“0”开头。每当编写器要更改文件时,它都会增加版本(即,在第一次访问时它将变为版本1)。然后更改内容并刷新结果。完成后,它会再次增加版本号(即,在第一次更新后变为2)。这样,奇数版本号表示编写器当前正在更改文件的内容;偶数版本号表示文件处于一致状态。@Jean LoupSabatier如果写入和读取不是原子的,则您的建议不能保证文件的状态。通过更新版本号“first”,然后写入更新,然后更新版本号“last”,您可以拆分操作,使它们成为非原子操作。假设读卡器刚刚读取了标题,即将读取数据。如何保证写入程序不会更新版本号并写入一些新数据?一点也解决不了这个问题。您将需要双重读取、校验和或哈希摘要来检查文件完整性。@Cheatah,我描述的场景确实是一种原始形式的同步,IMO,但是如果读卡器进程每次从文件中读取奇数版本的结构时都再次读取(并且读取直到获得偶数版本);如果每次从文件中读取完struct后,再次读取到它的版本号仍然与第一次读取时的版本号相同,我相信这保证了一致性。不过,考虑到我写了几个小时后的方法,我意识到这是一种相当粗糙的方法。
int fd = open("file", O_WRONLY);

if (fd >= 0){
    write(fd, &structure, sizeof(structure));
    close(fd);
}