【问题标题】:How many processes will be created by the C program below?下面的 C 程序将创建多少个进程?
【发布时间】:2022-10-02 06:31:05
【问题描述】:

你能给出一个解释和答案。我在识别这些系统调用创建的正确进程数时遇到了一些问题。

我认为将创建 8 个进程。

#include <stdio.h>

main()
{
    printf(\"Here comes the date. \\n\");    
    printf(\"Here it is. \\n\");

    fork();    
    fork();    
    fork();

    execl(\"/bin/date\", \"date\", 0); //Line A

    printf(\"That was the date. \\n\"); //Line B    
    printf(\"Program will exit now. \\n\"); //Line C    
}
  • 注意最后两个print() 函数调用将不会被执行(调用),除非execl() 调用失败。

标签: c process fork parent-child


【解决方案1】:

显示的代码创建了七个进程。当代码启动时,已经有一个进程在执行程序。然后fork 再创建一个,所以有两个。

然后这两个进程执行fork,每个进程再创建一个进程,所以有四个。

然后这四个进程执行fork,每个进程再创建一个进程,所以有八个。

因此创建了七个新进程。

execl 不会创建新进程;它只是改变进程正在执行的程序。

【讨论】:

  • @EricPostpichil 会有一个单亲还是每个分叉调用都有一个父母是 self ?你能澄清一下吗?
  • @Zakey.M.S.M.A:当一个进程调用fork时,它成为创建的子进程的父进程。
【解决方案2】:

Parent 创建了三个孩子,每个 fork() 一个,但是第一个孩子只执行两个 fork() 调用(它在第一个分叉之后开始),第二个创建一个新的孩子(最后一个分叉),最后一个没有创建(在最后一个叉子) 从第一个孩子开始,还有两个(第一个创建另一个孩子,第二个没有),所以我们总共有三个进程,两个,一个和一个,添加到创建的 7 个子进程,加上第一个,总共八个。您将看到前两行输出(因为尚未发出 fork()),然后是每个子孙执行一次 date 命令的七倍,最后两行没有输出,因为总是有一个 execv(2) 调用永不返回(仅在调用 date 命令失败时返回)

parent
 |
 + fork() -> cld1
 |            |
 |            + fork() -> cld11
 |            |            |
 |            |            + fork() -> cld111
 |            |            |           |
 |            |            |           +execv(date)
 |            |            |
 |            |            + execv(date)
 |            |   
 |            + fork() -> cld12
 |            |            |
 |            |            + execv(date)
 |            |
 |            + execv(date)
 |
 + fork() -> cld2
 |            |
 |            + fork() -> cld21
 |            |            |
 |            |            + execv(date)
 |            |
 |            + execv(date)
 |
 + fork() -> cld3
              |
              + execv(date)

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2013-11-01
    • 2013-02-24
    • 2014-06-22
    相关资源
    最近更新 更多