gpt4 book ai didi

linux - 如何从另一个进程不断写入的文件中可靠地读取数据?

转载 作者:太空狗 更新时间:2023-10-29 11:40:32 24 4
gpt4 key购买 nike

因此,我处于一个进程连续(每隔几秒)将数据写入文件(而不是追加)的情况。数据为json形式。现在另一个进程必须定期读取这个文件。现在可能是读取进程在写入进程写入文件时读取它。

我能想到的解决这个问题的方法是写进程也写一个相应的校验和文件。读取进程现在必须读取文件及其校验和文件。如果计算出的校验和不匹配,则读取器进程将重复该过程,直到计算出的校验和匹配为止。这样,现在它就知道它读取了正确的数据。

或者更好的方案是在一定时间后(远小于写入过程的写入间隔)读取文件两次,看读取的数据是否匹配。

第三种方法可能是在文件末尾写入一些魔法数据,以便读取过程知道它已经读取了整个文件,如果它在末尾遇到了那个魔法数据。

你怎么看?这些解决方案是否可行,或者是否有更好的方法来实现这一目标?

最佳答案

每次都创建一个全新的文件,并且rename()新文件一旦完全写入:

If newpath already exists, it will be atomically replaced, so that there is no point at which another process attempting to access newpath will find it missing. ...

文件的某些副本将始终存在,并且始终是完整和正确的:

所以,而不是

writeDataFile( "/path/to/data/file.json" );

然后尝试弄清楚在阅读器进程中要做什么,您只需做

writeDataFile( "/path/to/data/file.json.new" );
rename( "/path/to/data/file.json.new", "/path/to/data/file.json" );

不需要锁定,也不需要读取文件和计算校验和并希望它是正确的。

唯一的问题是每次需要读取最新副本时,任何读取进程都必须open() 文件 - 它无法保留并打开文件上的文件描述符并尝试读取新内容作为 rename() 调用取消链接原始文件并将其替换为一个全新的文件。

关于linux - 如何从另一个进程不断写入的文件中可靠地读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54089129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com