我如何在父子进程之间共享内存,这些进程在死亡时自动释放内存

时间:2009-08-25 10:21:45

标签: c unix

我知道“mmap”,但据我所知,如果我想共享父进程分配的内存并通过客户端进程访问它,我需要创建一个临时文件。

但是如果进程死亡,这个文件将继续存在。

我受过教育,永远不会留下垃圾。无论是现实生活还是编程。

该解决方案应适用于Linux,FreeBSD和Solaris。

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

Mmap通常支持“匿名”模式,不会产生任何垃圾。它适用于LInux,根据Solaris上的手册页,我不确定FreeBSD - 查看手册页并搜索MAP_ANON或MAP_ANONYMOUS。

答案 2 :(得分:0)

在Parent中分配内存。 在父级和子级中都使用此内存。 将责任释放给父母。 让父母等待(等待系统调用)。 父在退出之前释放内存。

另一方面,为了安全起见,在孩子退出之前检查父母是否还活着。 如果没有,请释放孩子自己的记忆。但如果可能有多个孩子,这将无效。

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

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

答案 3 :(得分:0)

使用POSIX shm_open(3)和相关函数来映射不由文件支持的内存。如果父和子不再存在,shm_open()返回的文件描述符应自动关闭,但我不是100%确定是否总是这样。也许其他人可以对此有所了解?

答案 4 :(得分:0)

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

  1. parentpid_childpid - 父写入和子读取
  2. childpid_parentpid - 孩子写和parebt读。
  3. 这对我有用。如果您有任何需要考虑的特殊情况,请提及。

答案 5 :(得分:0)

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

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