2009-08-25 23 views

回答

0

如上所述,命名管应该为你做。您可以使用两个管道(如果可能):

  1. parentpid_childpid - 家长写和孩子在读
  2. childpid_parentpid - 孩子写和读parebt。

这适用于我。请提一下,如果您有任何特殊的会议考虑。

2

这个article是共享内存的一个非常好的起点。

但是,我建议您一般使用管道,以避免竞争条件和并发的所有心理开销。当你打开一个子进程时,它的stdin和stdout就是你可以从父进程读写的文件描述符。

+0

对不起,这是我的软件中一个小而重要的部分,我需要能够尽可能快地交换数据集。 不,我并不害怕并发和竞争条件。我喜欢高速并发编程。但是在这里,我必须调用外部子进程,因为它可能会加载不应该能够使主应用程序崩溃的不安全插件。 – Lothar 2009-08-25 10:32:41

+2

听起来就像你处于最重要的事情,我链接的文章将是有道理的。 您最终会将父节点从共享缓冲区中读取的任何内容复制到父节点私有的缓冲区中,然后验证它,显然。在某些时候,你会尝试在用户环境中使用管道为你做什么,并且你可能不会发现管道本身就很慢。 – Will 2009-08-25 10:41:03

0

分配父内存。 在父母和孩子中使用此内存。 给父母释放记忆的责任。 让孩子等待(等待系统调用)。 父级在退出前释放内存。

另一种方法是在安全的一面,在孩子退出前检查父母是否存活。 如果没有,请释放孩子本身的内存。但如果可能有多个孩子,则这将不起作用。

您可以使用前几位内存来跟踪使用此内存的进程数量。每当一个进程开始使用内存时,它会增加此计数,并在退出之前递减计数。如果计数变为0,则释放内存。

还有另一种方法。写一个函数ownMalloc,它位于系统malloc之上(或者你使用的任何函数)。这会跟踪所有分配的内存以及使用它的进程。它定期检查分配的不同块并释放未使用的块。

1

Mmap通常支持不创建垃圾的“匿名”模式。它在LInux上工作,根据Solaris上的手册页,我不确定FreeBSD - 查看手册页并搜索MAP_ANON或MAP_ANONYMOUS。

+1

我应该在MAP_ANONYMOUS之前添加一个用于通过在mmap之后立即取消链接()该文件的技巧。这允许父进程和子进程使用共享内存。 – ondra 2009-08-25 10:44:20

+0

嗯,如果我使用MAP_ANONYMOUS什么文件描述符应该通过,如果不是一个文件?好吧,我可以尝试生成一个“/ tmp/dummy”文件,只是为了使用句柄(其中没有数据写入)。但它仍然留下一些垃圾。 – Lothar 2009-08-25 12:27:27

+0

当使用'MAP_ANONYMOUS'时,您传递'-1'作为文件描述符。 – caf 2009-08-25 12:49:50

0

使用POSIX shm_open(3)和相关函数映射未由文件支持的内存。如果父节点和子节点不存在,应该自动关闭由shm_open()返回的文件描述符,但是我不能100%确定是否总是这样。也许别人可以更多地了解这一点?

+0

对不起“shm”,posix信号量在FreeBSD上非常糟糕(shm按设计 - 正如我在FreeBSD邮件列表中的对话后发现的那样)。 – Lothar 2009-08-25 12:12:52

0

在父进程中分配内存,继续等待子进程执行或让他执行一些其他任务。一旦子进程结束,它将返回到父进程,释放那里的内存。

如果父进程需要在子进程之前停止(在这种情况下,子进程被认为是孤儿),然后使用exec()将启动子进程作为新进程。

相关问题