代码之家  ›  专栏  ›  技术社区  ›  MetallicPriest

如何从另一进程连续写入的文件中可靠地读取数据?

  •  2
  • MetallicPriest  · 技术社区  · 7 年前

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

    第三种方法是在文件末尾写入一些魔法数据,这样读取过程就知道它已经读取了整个文件,如果它在最后遇到了魔法数据的话。

    2 回复  |  直到 7 年前
        1
  •  2
  •   AKstat    7 年前

    如果要保证读者总是获取所有数据,请考虑使用名称管道。

    mkfifo ./jsonoutput

    然后将一个程序设置为写入,另一个程序设置为从该文件读取 ./jsonoutput .

    只要编写器在编写每个JSON后定期关闭并重新打开文件,读取器就会得到一个EOF并处理输入。

    然而,如果不是这样,读者只会继续阅读,而作者只会继续写作。如果这些程序不是为处理这样的数据流而设计的,那么它们可能永远不会处理数据,程序将挂起。

    如果是这种情况,那么您可以编写一个程序,从一个命名管道读取,直到它获得完整的JSON,然后通过第二个命名管道将其刷新到最终的程序。

        2
  •  2
  •   Andrew Henle    7 年前

    每次创建一个完整的新文件 rename()

    如果newpath已经存在,它将被原子替换,以便 没有其他进程试图访问的点 newpath会发现它丢失了。。。

    因此,与其

    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() 每次需要读取最新副本时,文件都会被删除-它无法保留和打开文件上的文件描述符,并尝试读取新内容 重命名() call取消原始文件的链接,并将其替换为一个全新的文件。