C - 如何查找以前由tmpfile()创建的临时文件?

时间:2009-09-27 17:14:02

标签: c fork temp

我正在开发一个多进程程序,它基本上对RVB文件的每一层执行模糊化。 (1个过程 - > 1层)。每个子进程都使用以下函数传递临时文件:tmpfile()。在每个子进程完成其作业之后,主进程必须读取创建的每个临时文件并组装数据。问题是我不知道如何读取主进程内的每个临时文件,因为我无法访问子进程内存,所以我不知道创建临时文件的临时指针是什么!

有什么想法吗?

如果需要,请不要犹豫要求澄清。

5 个答案:

答案 0 :(得分:4)

tmpfile()函数返回一个指向没有确定名称的文件的FILE指针 - 实际上,甚至子进程也无法轻易确定文件的名称,更不用说父文件了(并且在许多文件上)在Unix系统中,该文件没有名称;在tmpfile()返回调用者之前它已被取消链接。)

extern FILE *tmpfile(void);

因此,如果必须传送文件名,则使用错误的临时文件创建原语。

您有多种选择:

  1. 让父进程使用tmpfile()创建文件流,以便父进程和子进程共享文件。有一些小的协调问题需要处理 - 父母需要在阅读孩子写的内容之前回顾起点,而且只有在孩子退出后才能这样做。
  2. 使用其中一个文件名生成原语 - mkstemp()是好的,如果需要FILE指针而不是文件描述符,可以使用fdopen()创建一个。{1}}。你仍然面临着从孩子到父母获取文件名的问题;再一次,父母可以打开文件,或者你可以为每个孩子或一些共享内存使用管道,或者......选择IPC机制。
  3. 让父母在分叉前为每个孩子打开一根烟斗。子进程关闭管道的读取端并写入写入端;父关闭管道的写入端并安排从读取端读取。这里有多个孩子的问题是任何给定管道的容量是有限的(并且非常小 - 通常约为5 KiB)。因此,您需要确保父级完全读取所有管道,请记住,在读取所有数据之前,子级将无法退出(严格地说,除了已读取的最后一个缓冲区之外的所有数据)。
  4. 考虑使用线程 - 但要注意使用线程的协调问题。
  5. 决定您不需要使用多个控制线程 - 无论是进程还是线程 - 而只需让主程序完成工作。这消除了协调和IPC问题 - 它确实意味着您不会从机器上的多核处理器中受益。
  6. 其中,假设并行执行至关重要,我可能会使用管道从子代中获取文件名(选项2);它的协调问题最少。但为简单起见,我会选择'主程序做到这一切'(选项5)。

答案 1 :(得分:3)

您可以在父进程中创建一个临时文件然后fork,然后让子进程使用它。

答案 2 :(得分:3)

如果你在父进程中调用tmpfile(),子进程将继承所有打开的描述符,并且能够写入该文件,并且父进程也可以访问打开的文件。

答案 3 :(得分:1)

子进程可以将filedescriptor发送回父进程。

编辑:APUE站点中的示例代码(src.tar.gz / apue.2e / lib,recvfd.c,sendfd.c)

答案 4 :(得分:0)

使用线程而不是子进程?将临时文件的名称放在另一个文件中?不要为临时文件使用随机名称,而是(例如)基于父进程的pid的名称(允许程序的多个实例同时运行)加上序号?