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

时间:2018-10-29 10:03:02

标签: c++

我有一个创建多个派生流程和每个分叉流程的流程  创建一个具有相同名称的文件。但是要求是任何一个分支过程都只能创建一个文件。

能否请您建议如何确保仅通过一个过程创建文件。

我试图在写入文件之前检查文件是否存在,但是由于多个进程正在通过该检查,因此它无法正常工作。

2 个答案:

答案 0 :(得分:2)

  

能否请您建议如何确保仅由一个进程创建文件。

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

答案 1 :(得分:0)

您可以在分支之前中打开文件。然后,根据this的答案,每个孩子都可以重复使用文件描述符,就可以了。

当然,您仍然需要一些方法来同步不同的进程,以便正确地交错写入文件(一个进程写入AB,另一个进程C产生{{1 }}或ABC,但不是 CAB ...)。使用线程更容易做到这一点,因此,如果您可以使用它们,您可能会更喜欢它们。否则,您可能会对this答案感兴趣。

编辑(根据要提问的新评论):如果我理解正确,则需要执行以下操作:

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

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

  1. 父进程将在分叉之前打开一个新的临时文件,每个孩子的名字都可以随意命名。按照上述方式,父级和子级都可以使用相同的文件描述符。
  2. 在分叉之后,子进程使用文件描述符将其信息写入其中,父进程将描述符推入e。 G。 ACB,或更合适的是std::vector将PID映射到FD。
  3. 父进程等待子进程,终止时会使用存储的文件描述符来读回信息。

您是否考虑过改用pipes?他们可能是更好的选择...