【问题标题】:Fork()-ing a new processfork()——创建一个新进程
【发布时间】:2013-05-21 02:40:27
【问题描述】:

Fork()——一个进程最终会在内核内部调用 do_fork(),制作一个自身的精确副本。当我阅读书籍时,它说 fork 的孩子将调用 exec 来创建新进程。

示例:

shell 上的 ls 命令,会以这种方式创建。

   sh(Parent)
       |
   sh(Child)
       |
   ls(New Process)

但是,我无法理解 exec*() 的调用方式和位置? 因为,我所看到的只是 shell(child) 是在 fork 中创建的。 但是,新流程将在何时何地创建/执行?

【问题讨论】:

    标签: linux process exec creation


    【解决方案1】:

    如果你真的想要一个新程序在其中一个进程中运行(通常是子进程,但不是绝对必要的),你必须exec()。在shell执行ls的特定情况下,shell首先分叉,然后子进程执行。但重要的是要意识到这是两个不同的操作。

    fork() 所做的只是给你两个(几乎)相同的进程,然后你可以使用来自fork() 的返回码来决定你是否是父母(你得到孩子的正 PID,或者 -1如果 fork() 失败)或孩子(你得到 0)。

    请参阅this answer,了解fork()exec() 如何协同工作(在您的 控制下)以及如何在没有彼此的情况下使用它们。

    类似于do_fork()exec 的东西都归结为对位于exec.cdo_execve 的调用。

    【讨论】:

    • 感谢您的回答。你能告诉我 exec() 在内核中的位置吗?
    • exec 是一个单独的系统调用。 fork() 返回两次(成功时),一次在子进程中,一次在父进程中。接下来发生的事情取决于过程中的代码。
    • @Saran-san,我已经用内核 exec 详细信息更新了答案。
    • @paxdiablo - 非常感谢......感谢您的快速回复
    • 系统调用实际上是execve(2)。其他exec 函数正在调用execve。阅读advancedlinuxprogramming.com,它对您的问题有很好的完整解释。
    猜你喜欢
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2023-03-22
    • 2017-02-25
    相关资源
    最近更新 更多