首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用vfork的双分支

使用vfork的双分支
EN

Stack Overflow用户
提问于 2010-04-11 22:09:53
回答 5查看 1.7K关注 0票数 3

我正在编写一个服务器的一部分,它应该调度一些其他的子进程。

因为我希望等待一些进程,并在不等待完成的情况下分派其他进程,所以我对第二种进程使用了double fork (从而避免了僵尸进程)。

问题是,我的服务器拥有大量内存,所以fork需要很长时间(甚至Linux中使用的只复制分页表的写入时复制fork)

我想用vfork()替换fork(),而且第二个fork很容易(因为它只在孩子中调用execve() ),但是我找不到任何方法来替换第一个fork。

有人知道我是怎么做到的吗?

谢谢!

服务器是用C++编写的linux (RH5U4)。

EN

回答 5

Stack Overflow用户

发布于 2010-04-12 18:40:52

为什么不简单地让新执行的进程自己做另一个分支呢?这样一来,只有一个很小的简单进程会复制它的页表?

编辑:

当然,父进程必须执行一个短时间的wait()来清除那个僵尸,但是孙子进程可以运行它想运行的时间。

票数 2
EN

Stack Overflow用户

发布于 2010-04-11 22:21:20

vfork()只能用于派生,然后调用execexit。此外,vfork()将阻塞父进程,直到子进程调用_exitexec,这几乎肯定不是您想要的行为。

这样做的原因是vfork()不会为新进程制作任何数据的副本,包括堆栈。因此,所有东西都是共享的,很容易意外地更改父进程无法处理的内容。由于数据是在没有副本的情况下共享的,因此父进程不能继续与子进程同时运行,因此它必须等待子进程执行_exit或调用exec,以便在父进程开始修改数据时不再使用该数据。

票数 1
EN

Stack Overflow用户

发布于 2010-04-13 00:38:25

我认为您真正想要做的是利用SIGCHLD并维护一个子进程列表。然后,您可以通过当子进程更改状态时(主要是在它们死亡时)通知您的主进程,并基于此对它们执行一些操作,从而消除double fork。您还可以跟踪任意子进程完成所需的时间(因为您将它们的创建时间存储在列表中),并在它们疯狂且永远不会完成时采取行动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2617289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档