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

标签 c fork temp

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

有什么想法吗?

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

最佳答案

tmpfile() 函数返回一个 FILE 指针,指向一个没有确定名称的文件——事实上,即使是子进程也不能轻易确定文件的名称,更不用说父文件了(在许多 Unix 系统上,该文件没有名称;它在 tmpfile() 返回给调用者之前已被取消链接)。

extern FILE *tmpfile(void);

因此,如果您必须传达文件名,那么您使用了错误的临时文件创建原语。

您有多种选择:

  1. 让父进程使用tmpfile() 创建文件流,以便父进程和子进程共享文件。有一些小的协调问题需要处理——在阅读 child 写的内容之前, parent 需要回到起点,而且应该只在 child 退出后才这样做。
  2. 改用文件名生成原语之一 - mkstemp() 很好,如果您需要 FILE 指针而不是文件描述符,您可以使用 fdopen() 创建一个。您仍然面临着从 child 到 parent 获取文件名的问题;同样,父级可以打开文件,或者您可以为每个子级使用一个管道,或者一些共享内存,或者……选择 IPC 机制。
  3. 在 fork 之前让 parent 为每个 child 打开一个管道。子进程关闭管道的读端,向写端写入;父关闭管道的写入端并安排从读取端读取。这里有多个 child 的问题是任何给定管道的容量都是有限的(而且非常小——通常约为 5 KiB)。因此,您需要确保父级完全读取所有管道,请记住,在读取所有数据之前,子级将无法退出(严格来说,除了最后一个缓冲区已满以外的所有数据都已读取)。<
  4. 考虑使用线程 - 但要注意使用线程的协调问题。
  5. 决定您不需要使用多线程控制 - 无论是进程还是线程 - 只需让主程序完成工作即可。这消除了协调和 IPC 问题 - 这确实意味着您不会从机器上的多核处理器中受益。

其中,假设并行执行是最重要的,我可能会使用管道从子项中获取文件名(选项 2);它的协调问题最少。但为简单起见,我会选择“主程序完成所有工作”(选项 5)。

关于C - 如何找到之前由 tmpfile() 创建的临时文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1483980/

相关文章:

c - 用 C 读取并打印 Unicode 和 UTF-8 编码

c++ - 使用 %s 格式化时 # 的作用是什么

c - 使用管道在子进程上执行 wc 命令

sql - 如果使用附加列名再次创建删除的临时表,则无法选择附加列名

c++ - 调色板图像需要有效的调色板

c - 在目录中列出文件名并将它们放入字符串中 - 段错误

android - fork() 返回现有进程的 pid

c - 如何将信号从父进程重定向到子进程?

c++ - 为什么我不能使用带有 ofstream 的 Windows 环境路径来编写文本文件?

jenkins - Hudson 免费临时空间位置