【问题标题】:Creating new processes with fork() vs exec()使用 fork() 与 exec() 创建新进程
【发布时间】:2018-04-18 08:04:22
【问题描述】:
#1 code
    int child_pid;
    for (int i = 0; i < 3; i++)
    {
    child_pid = fork();
    if (child_pid == 0) 
    { sleep(10); }
    else
    { wait(&status); }
    }
    execlp("sleep","sleep","20",(char*)NULL);

#2 code
    int child_pid;
    for (int i = 0; i < 5; i++)
    {
    child_pid = fork();
    if (child_pid == 0) 
    { sleep(1); }
    else
    { wait(&status);
      execlp("sleep","sleep","20",(char*)NULL); }
    }

有人可以向我解释这些代码中发生了什么吗? 我了解 fork() 向新创建的子进程返回零。这就是为什么我不明白为什么在 #2 代码中 else 分支也正在执行? execlp 用新的进程映像替换调用进程映像,但这究竟意味着什么?

编辑: 答案是第一个代码将创建 8 个进程,但我无法理解如何?为什么第一个代码会完成 230 秒? exec 对此有何影响?

第二个代码将创建 5 个进程,但它会在 (5*2sec+5*20sec) 之后完成。在第二个代码中,为什么会转到 else 分支?

我试图了解创建了多少进程以及代码休眠的原因和时间?

提前致谢。

【问题讨论】:

  • 请正确格式化您的代码
  • “这就是为什么我不明白为什么在 #2 代码中 else 分支也正在执行?”你期望调用过程会发生什么?
  • 因为我希望 fork() 返回 0,所以它什么时候去 else 分支。我已经编辑了我的问题以澄清
  • “我试图了解创建了多少进程,以及代码为什么会休眠以及休眠多长时间?” 所以运行它?或者阅读足够多的文档,以便您可以在脑海中逐步完成代码并弄清楚? IMO,正如 SO 不是代码编写服务一样,它也不应该是代码解释服务。

标签: c++ c multithreading


【解决方案1】:

fork会返回两次,一次在原进程,返回值为子进程的pid,另一次在子进程,返回值为0

【讨论】:

    【解决方案2】:

    描述

    fork() 通过复制调用进程来创建一个新进程。新进程称为子进程。调用进程称为父进程。

    和:

    返回值

    成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回-1,不创建子进程,并正确设置errno。

    所以,在 fork() 之后,你有了新创建的进程,所以你有 2 个进程,子进程(新进程)和父进程(初始进程)。

    所以,当您的父母 (pid > 0) 执行您的睡眠时,您的孩子 (pid == 0) 正在进入睡眠状态。

    在执行 exec*(execl、execlp、execv、execve 等)之后,您的进程将被终止(尝试在 execlp 之后放置 printf 或其他任何内容,您会看到它永远不会打印它(除非以防万一错误(execlp 的返回值 == -1))。

    回答您最初的问题: 是的,你的程序在你的 else 中传入你的 if AND (把 printf 看得更清楚),因为你实际上有 2 个进程,你甚至可以尝试在 else 语句之后放置一个 printf,在在程序的最后,你会看到孩子通过了(打印他的 pid,它应该等于 0)。

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 2011-07-02
      • 1970-01-01
      • 2011-05-18
      • 2023-03-22
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      相关资源
      最近更新 更多