没有。即使我没有使用父进程,进程也是指数级的

时间:2016-07-24 03:22:55

标签: c fork

即使我运行的代码部分仅在子进程中输出某些内容,但输出很多次。就像在这里我给chunk = 8但输出就像100次以上。

Here is the code:

#include<stdio.h>
#include<string.h>


int main(){

int chunks=8;

int proc[25];
for(int proc_iter=0;proc_iter<chunks;proc_iter++){
    proc[proc_iter]=fork();

    if(proc[proc_iter]==0){
    printf("I am getting called with i=%d",proc_iter);
    }
}
return 0;
}

1 个答案:

答案 0 :(得分:2)

这里的问题是子进程正在执行与父进程相同的循环,因此它也会分叉。

如果将chunks设置为2并在初始循环后添加以下循环:

for (int i=0;i<chunks;i++){
    printf("pid %d, i=%d, proc[i]=%d\n",getpid(),i,proc[i]);
}

您将获得如下所示的输出:

I am getting called with i=0
pid 30955, i=0, proc[i]=30956
pid 30955, i=1, proc[i]=30958
pid 30957, i=0, proc[i]=0
pid 30957, i=1, proc[i]=0
pid 30956, i=0, proc[i]=0
pid 30956, i=1, proc[i]=30957
I am getting called with i=1
pid 30958, i=0, proc[i]=30956
pid 30958, i=1, proc[i]=0

在循环的第一次迭代中,创建一个新进程。然后两个进程分别迭代循环第二次,每个进程分叉另一个子进程。然后,所有四个过程都完成循环。

如果您不希望子进程也循环,请让孩子调用exit

if (proc[proc_iter]==0) {
    printf("I am getting called with i=%d\n",proc_iter);
    exit(0);
}

然后输出看起来像这样:

I am getting called with i=0
I am getting called with i=1
pid 31020, i=0, proc[i]=31021
pid 31020, i=1, proc[i]=31022