即使我运行的代码部分仅在子进程中输出某些内容,但输出很多次。就像在这里我给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;
}
答案 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