【问题标题】:How many processes are created in this excerpt of code?在这段代码中创建了多少进程?
【发布时间】:2015-03-03 21:06:17
【问题描述】:

你能帮我解决这个问题吗?我对进程的创建有点困惑,我认为创建的进程数是 7,对吗?

int main(){
    pid_t pid;
    int i;
    for (i = 0; i < 3; i++){
        pid = fork();
        if(pid > 0){
            printf("I'm father\n");
        }else{
            sleep(1);
        }
    }

    return 0;
}

【问题讨论】:

  • 为什么你会认为它是 7?提示man fork
  • @KevinDTimm 既然是正确答案,他为什么不认为是 7? :)
  • 我的想法是它是 4:父级(每次迭代的非零回报)和 3 个子级,在循环的每次迭代中创建一个。但是,在下面查看@John 的答案,我发现我可能需要更新我的想法。

标签: c process fork


【解决方案1】:

你是对的,7 个进程是分叉的(加上原来的父进程,总共有 8 个)。关键概念是,分叉进程最初(接近)完全复制其父进程,因此特别是,它们具有相同的变量值,并通过从 fork() 调用返回开始执行。下表列出了您的程序中将发生的分叉:

  i  proc0  proc1  proc2  proc3  proc4  proc5  proc6  proc7
 -----------------------------------------------------------------
  0    +1    new
  1    +1     +1    new    new
  2    +1     +1     +1     +1    new    new    new    new

+1s 表示分叉;将它们加起来得到 7。在i == 2 时创建了分叉进程 4 - 7,但它们自己不会分叉,因为它们在执行此操作之前就掉到了循环的底部(并且它们的父进程在它们可以分叉之前就掉到了底部)再次)。

还要注意,进程的标签proc2 - proc7 不直接传达有关父系或创建顺序的信息;该表仅在派生时将每个标签与变量i 的值相关联,并描述每个进程在开始运行时根据i 的值进行派生的次数。

【讨论】:

  • 这是我的推理,但我不确定,非常感谢:)
  • @jschultz410,进程“child3”是在分叉时由具有i == 1 的父级分叉的两个进程之一(参见表的第一列);它可能是原始进程的直接子进程或其孙进程。由于它是用i == 1 分叉的,它肯定会执行循环的一次迭代,在此期间它会分叉。它是在拥有i == 2 的同时调用fork() 的四个进程之一。
  • @jschultz410,我选择了我所做的列标签和“+1”,以避免对事件顺序的错误影响(即使这样我也没有完全实现)。因此,为了解决潜在的混淆,我在表中添加了其他四个进程的列。我希望将标签 child4 - child7 放在桌子上,而不是只在文本中,这将增加读者认识到这些标签指的是所有子流程的可能性,而不管父级如何。
  • @jschultz410,好的,我重新标记了流程以避免使用“儿童”术语。我最初的想法不是追溯祖先,而只是将分叉的过程与原始过程区分开来。新标签不再强调这种区别,但我认为并没有完全消失。
【解决方案2】:

如果您在创建孩子时打印来自孩子的消息,则更容易查看发生了什么。

#include <stdio.h>
#include <unistd.h>

int main( void )
{
    pid_t pid;
    for ( int i = 0; i < 3; i++ )
    {
        pid = fork();
        if (pid > 0)
            sleep(1);       // give the child time to print its message
        else if (pid == 0)
            printf( "I'm child %d, my parent is %d\n", getpid(), getppid() );
    }
}

示例输出:

I'm child 308, my parent is 307
I'm child 309, my parent is 308
I'm child 310, my parent is 309
I'm child 312, my parent is 308
I'm child 311, my parent is 307
I'm child 313, my parent is 311
I'm child 314, my parent is 307

【讨论】:

    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2017-03-06
    • 2019-08-22
    • 2014-06-22
    • 1970-01-01
    相关资源
    最近更新 更多