【发布时间】:2020-12-29 20:17:27
【问题描述】:
有人可以解释fork() 并举例说明它的用途吗?
我从一些在线资源的理解是:
- fork() 创建一个与父进程运行相同的子进程。
- 2^n 进程将被创建,n = fork() 的数量。
- 子进程的 ID 将始终为 0,而父进程的 ID 将是其他值 - 正整数!= 0。
我还有一个问题,首先请看我下面的代码:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main() {
int id = fork();
int i = 45;
fork();
fork();
if(id == 0) {
printf("\nChild Process id = %d",id);
printf("\ni = %d ; i = %d",i++,i);
}
else {
printf("\nParent Process id = %d",id);
printf("\ni = %d ; i = %d",i,i+2);
}
return 0;
}
/*
O/P:
Parent Process id = 9048
i = 45 ; i = 47
Parent Process id = 9048
i = 45 ; i = 47
Parent Process id = 9048
i = 45 ; i = 47
Parent Process id = 9048
i = 45 ; i = 47
Child Process id = 0
i = 45 ; i = 46
Child Process id = 0
i = 45 ; i = 46
Child Process id = 0
i = 45 ; i = 46
Child Process id = 0
*/
为什么最后一个子进程不显示第二个 printf() 即,
printf("\ni = %d ; i = %d",i++,i);
你能解释一下为什么第二个 printf() 没有被执行,而第一个 printf() 第 8 次执行 - 子进程。
【问题讨论】:
-
您的打印问题几乎肯定是由缓冲问题引起的,例如printf anomaly after “fork()”。其他一切都只是在此之上增加复杂性。
-
你读过fork(2)几遍吗?使用errno(3) 和stdio(3) 和Advanced Linux Programming?你研究过GNU libc的源码吗?另见kernelnewbies.org
-
请注意,执行
printf("\ni = %d ; i = %d",i++,i);的程序的行为不是由C 标准定义的,C 标准对程序的行为方式没有任何要求。按照C标准的规定,这个程序根本不需要fork;一旦启动main例程,它可能会以其他方式陷入困境或失败。 -
@BasileStarynkevitch 我们不妨关闭 stackoverflow 并有一个单独的 html 页面列出要研究的资源。
-
@TonyTannous stackoverflow 的所有者当然可以关闭它。