在这段代码中创建了多少个进程?

时间:2015-03-03 21:06:17

标签: c process fork

你能帮我解决这个问题吗?我对进程的创建有点困惑,我认为创建的进程数是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;
}

2 个答案:

答案 0 :(得分:5)

你是对的,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

+1表示分叉;将它们加起来得到7.分叉进程4 - 7是在i == 2时创建的,但是它们本身并不是因为它们在它们可以这样做之前掉出了循环的底部(并且它们的父母在它们之前掉出了底部)可以再次分叉。)

另请注意,流程proc2 - proc7的标签不直接传达有关父母或创建顺序的信息;该表仅在分叉时将每个标签与变量i的值相关联,并描述每个进程在其开始运行时作为其i值的函数分叉的次数。

答案 1 :(得分:1)

如果您在创建孩子时打印来自孩子的消息,则更容易看到正在发生的事情。

#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