fork() 的两个简单案例研究
Two simple case studies of fork()
我写了两个简单的程序来理解 fork() API。
第一个节目:
int multiple_fork(){
fork(); //prints 2 times
fork(); //prints 4 times
printf("hello\n");
exit(0);
}
int main(){
multiple_fork();
return 0;
}
这个程序会打印"hello"四次,因为第一个fork()产生一个子线程(C0),第二个fork从父线程(P)和C0产生另外两个子线程C1和C2,分别。到目前为止一切顺利。
第二个节目:
#define N 2
int main(){
int status, i;
pid_t pid;
/* parent creates N children */
for(i = 0; i < N; i++)
if((pid = fork()) == 0){ /* Child */
printf("Child\n");
exit(100+i);
}
return 0;
}
这将打印 "Child" 两次,我不明白,因为我希望 "Child" 打印三次。原因:
在第一个循环中,生成了一个子进程 (C0),因此该子进程将打印 "Child" 一次。由于C0包含与父进程P相同的地址space。那么P和C0都会执行第二个循环。所以 C1 和 C2 分别从 P 和 C0 生成。所以对于C1和C2,每个子进程都会打印一次"Child"。因此,它应该打印 3 次 "Child"。但显然,我错了。有人可以解释发生了什么吗?
当fork(2)
returns时,只有child会有pid == 0
,所以只有两个children,每次迭代分叉,会进入if
块并打印。
这两个children不会继续fork,因为你调用了exit(2)
系统调用
我写了两个简单的程序来理解 fork() API。
第一个节目:
int multiple_fork(){
fork(); //prints 2 times
fork(); //prints 4 times
printf("hello\n");
exit(0);
}
int main(){
multiple_fork();
return 0;
}
这个程序会打印"hello"四次,因为第一个fork()产生一个子线程(C0),第二个fork从父线程(P)和C0产生另外两个子线程C1和C2,分别。到目前为止一切顺利。
第二个节目:
#define N 2
int main(){
int status, i;
pid_t pid;
/* parent creates N children */
for(i = 0; i < N; i++)
if((pid = fork()) == 0){ /* Child */
printf("Child\n");
exit(100+i);
}
return 0;
}
这将打印 "Child" 两次,我不明白,因为我希望 "Child" 打印三次。原因: 在第一个循环中,生成了一个子进程 (C0),因此该子进程将打印 "Child" 一次。由于C0包含与父进程P相同的地址space。那么P和C0都会执行第二个循环。所以 C1 和 C2 分别从 P 和 C0 生成。所以对于C1和C2,每个子进程都会打印一次"Child"。因此,它应该打印 3 次 "Child"。但显然,我错了。有人可以解释发生了什么吗?
当fork(2)
returns时,只有child会有pid == 0
,所以只有两个children,每次迭代分叉,会进入if
块并打印。
这两个children不会继续fork,因为你调用了exit(2)
系统调用