c++多进程编写一个唯一的文件

c++ multiprocess writing a unique file

本文关键字:一个 唯一 文件 多进程 c++      更新时间:2023-10-16

我有一个进程,它创建多个分叉进程,每个分叉进程创建具有相同名称的文件。但要求是由任何一个分叉进程只创建一个文件。

你能建议一下如何确保文件只由一个进程创建吗。

在写文件之前,我试图检查文件是否存在,但它不起作用,因为多个进程正在通过检查。

您能建议如何确保文件只由一个进程创建吗。

  1. 每个并发进程(或线程(在目标目录中创建自己的文件,该文件具有唯一的临时文件名mkstemp
  2. 然后进程rename将该文件转换为目标文件名。重命名是原子的,要么成功,要么失败。如果失败,则说明另一个进程已经创建了该文件。在这种情况下,可以删除临时文件,而应该打开具有目标文件名的文件

您可以在分叉之前在父进程中打开文件。然后,根据这个答案,每个孩子都可以重复使用文件描述符,你应该没事了。

当然,您仍然需要一些方法来同步不同的进程,以便正确地交错写入文件(一个进程写入AB,另一个进程写C,结果是ABCCAB,但不是ACB…(。对于线程来说,这样做更容易,所以如果可以使用它们,您可能更喜欢它们。否则,这个答案可能会引起你的兴趣。

编辑(根据问题的新评论(:如果我理解正确,你想做以下事情:

  • 父进程创建多个子进程
  • 每个孩子都将一些信息写入一个文件
  • 在每个或所有子项终止后,父项从文件中读回信息

然后您可以执行以下操作:

  1. 父进程在分叉之前为每个子进程打开一个具有任意名称的新临时文件。这样,根据上面的内容,父级和子级具有相同的可用文件描述符
  2. 分叉后,子进程使用文件描述符将其信息写入,父进程将描述符推送到例如std::vector,或者如果更合适的话,将PID映射到FD的std::map
  3. 父进程等待子进程,在终止时使用存储的文件描述符来读回信息

您是否考虑过改用管道?它们可能是更好的选择。。。