【问题标题】:"in vfork() , after calling _exit() the child never comes back to the execution " is this true?“在 vfork() 中,调用 _exit() 后,孩子永远不会回到执行中”这是真的吗?
【发布时间】:2013-08-17 16:09:26
【问题描述】:

我正在研究 unix 系统调用和进程控制。 我知道当调用 vfork() 时,将控制权交给子进程,当子进程完成时,它会调用 _exit() ,然后将控制权交给父进程。

第一个问题是:“我想在父进程之后将子进程带到执行中”,,,有可能吗?

如果没有:在 vfork() 的情况下,父母和孩子如何同时运行??? 如果是:为什么我们需要使用 vfork()(大部分功能与 fork() 相同)

第二个问题,我知道 fork 和 vfork 的进程结构,但是不知道在哪里使用哪个?

请帮忙。

【问题讨论】:

    标签: kernel linux-kernel fork


    【解决方案1】:

    问题 2 的简单答案是:始终使用 fork。永远不要使用vfork

    我不确定您在问题 1 中到底要问什么。vforked 进程只能使用两个系统调用:_exitexecve。 (实际上,它可以使用exec 家族中的任何一个,但execve 是最常见的。)一旦它做了其中一件事情,它要么死了(_exit),要么不再是vfork(@987654330) @),并且父级将不再被阻止。所以一旦孩子有了新的记忆形象,孩子和父母就可以共存了。

    在正常情况下,孩子会尝试调用execve,除非失败,否则永远不会返回,然后立即调用_exit,这只会在execve失败时发生。

    子进程不能调用dupclose,这通常是正确设置子进程所必需的。它不能修改任何内存(因为内存属于父级。)所以它很少甚至有用。

    曾几何时,进程创建很慢。如今,它更快了,并且大多数类 unix 操作系统(包括 Linux 和 FreeBSD)都使用“写时复制”,这大大降低了不修改内存(或修改很少内存)的分叉子代的成本.因此vfork 所施加的限制和缺乏安全性不再有用。

    vfork 在 2008 版中已从 Posix 中删除,应视为已弃用。

    如果您确实发现fork 是一个性能问题,您应该考虑使用posix_spawn,如果它在您的系统上可用。 (据我所知,它在最新版本的 Linux 上可用,并且在 FreeBSD 和 Solaris 上可用已有一段时间了。)实际上可能调用vfork,但它至少会处理细节而不会导致未定义行为。

    【讨论】:

      【解决方案2】:

      第一个问题是:“我想在父进程之后让子进程执行”

      很明显这不是vfork() 的用途。但是,这就是系统调用的 exec 组(execlexecv 等)所做的,除了子进程必须是独立的可执行文件。如果你只是想让一件事接二连三地发生,你不需要 fork 或 exec 任何东西,只需将代码按正确的顺序排列即可;)

      第二个问题,我知道 fork 和 vfork 的进程结构,但是不知道在哪里使用哪个?

      vfork() 更专业和受限制,所以一般你会使用fork()。 linux vfork 手册页提供了有关其使用价值的线索:

      vfork() 是 clone(2) 的一个特例。它用于创建新的 进程而不复制父进程的页表。 它 对性能敏感的应用程序可能很有用,其中孩子是 创建后立即发出 execve(2)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多