我正在开发一个多进程程序,该程序基本上对 RVB 文件的每一层执行模糊化。(1 个进程 -> 1 层)。每个子进程都使用以下函数传递一个临时文件:tmpfile()
. 每个子进程完成其工作后,主进程必须读取创建的每个临时文件并组装数据。问题是我不知道如何读取主进程中的每个临时文件,因为我无法访问子进程的内存,所以我不知道创建的临时文件的临时指针是什么!
任何的想法?
如果需要,请随时要求澄清。
该tmpfile()
函数返回一个FILE
指向没有确定名称的文件的指针——事实上,即使是子进程也无法轻易确定文件的名称,更不用说父进程了(在许多 Unix 系统上,文件没有名称;它已被取消链接在tmpfile()
返回给调用者之前)。
extern FILE *tmpfile(void);
因此,如果您必须传达文件名,那么您使用的是错误的临时文件创建原语。
您有多种选择:
tmpfile()
以便父进程和子进程共享文件。有一些小的协调问题需要处理——在阅读孩子们写的东西之前,父母需要回到起点,而且只有在孩子退出后才应该这样做。mkstemp()
很好,如果您需要一个 FILE 指针而不是文件描述符,您可以使用fdopen()
创建一个。您仍然面临从子级到父级获取文件名的问题;再次,父母可以打开文件,或者您可以为每个孩子使用管道,或者一些共享内存,或者......选择 IPC 机制。其中,假设并行执行至关重要,我可能会使用管道从子级获取文件名(选项 2);它的协调问题最少。但为简单起见,我会选择“主程序完成所有工作”(选项 5)。
您可以在父进程中创建一个临时文件,然后分叉,然后让子进程使用它。
如果您tmpfile()
在父进程中调用,子进程将继承所有打开的描述符并能够写入文件,并且父进程也可以访问打开的文件。
子进程可以将文件描述符发送回父进程。
编辑:APUE站点中的示例代码(src.tar.gz/apue.2e/lib、recvfd.c、sendfd.c)
使用线程而不是子进程?将临时文件的名称放在另一个文件中?不要为临时文件使用随机名称,而是(例如)基于父进程的 pid 的名称(以允许您的程序的多个实例同时运行)加上序号?