双叉使用vfork

您好
我正在写一个服务器的一部分,它应该派遣一些其他的subprocess。
因为我想等待一些进程,并且不用等待完成而派发其他进程,所以我使用双叉进行第二种进程(从而避免了僵尸进程)。
问题是,我的服务器拥有大量内存,所以分叉需要很长时间(甚至是在Linux中使用的copy-on-write fork,它只复制分页表)
我想用vfork()来replacefork(),第二个fork很容易(因为它只调用了child中的execve()),但我找不到任何可以replace第一个的方法。
有谁知道我该怎么做?
谢谢!

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

为什么不简单地让新执行的程序自己做另一个分支呢? 那样只有一个小的简单的过程将其页面表复制?

编辑:

当然,家长必须做一个短时间的等待()来清除那个僵尸,但是孙子的过程可以运行,只要它想。

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

原因是vfork()不会为新进程创建任何数据的副本,包括堆栈。 所以一切都是共享的,并且很容易意外地改变父进程无法处理的东西。 由于数据是没有拷贝共享的,所以父进程不能与子进程同时继续运行,所以必须等待子进程_exit或调用exec ,以便在父进程修改时不再使用这些数据。

我认为你真正想要做的就是利用SIGCHLD并维护一个子进程列表。 然后你可以通过让你的主进程在儿童改变状态(大部分是在他们死的时候)得到通知并根据这个进行一些操作来消除双叉。 你也可以跟踪你的任何一个子进程的完成时间比预期的要长(因为你把他们的创建时间存储在你的列表中),并且如果他们疯狂并且从未完成就采取行动。

不要双叉。 处理SIGCHLD保存errno,调用wait,恢复errno。

我相信你可以用我提出的另一个问题的答案,出于类似的原因。 您可以将vfork() + exec()重新分叉为可执行文件。 在调用vfork()/ clone()中的execv()之前,请参阅setuid()