C 了解for循环中的fork()和exit()的用法
嘿,我有一个关于fork的问题,以及它在for循环中的行为 因此,我提出以下问题: 创建一个父进程,创建10个子进程,每个子进程在for循环中打印实际的i值。这个代码正确吗C 了解for循环中的fork()和exit()的用法,c,process,fork,C,Process,Fork,嘿,我有一个关于fork的问题,以及它在for循环中的行为 因此,我提出以下问题: 创建一个父进程,创建10个子进程,每个子进程在for循环中打印实际的i值。这个代码正确吗 int i; for(i=0;i < 10;i++){ if(fork()==0){ print(i); } exit(0); } 是否有人能证实这是正确的,或者帮助我更好地理解这是错误的 谢谢:fork调用不会创建一对新的进程父进程、子进程,而是离开原始进程父进程并创建另一个进程子进程,因此
int i;
for(i=0;i < 10;i++){
if(fork()==0){
print(i);
}
exit(0);
}
是否有人能证实这是正确的,或者帮助我更好地理解这是错误的
谢谢:fork调用不会创建一对新的进程父进程、子进程,而是离开原始进程父进程并创建另一个进程子进程,因此它返回两次
在您的第一个代码片段中,您实际上只有一位家长。唯一的问题是,它在第一次迭代时就完成了:
看:i=0,现在我们只有父进程称之为p。
P进入fork并离开它两次:在P中返回子对象的PID,在新创建的子对象C0中返回0。然后,根据if语句,C0打印0,P不执行任何操作。然后执行路径收敛,P和C0都退出。现在我们根本没有我们的流程
第二个代码段的循环体可以重写如下:
p = fork();
if (p == 0) {
print(i);
}
if (p > 0) {
exit(0);
}
假设fork不会返回负数错误,那么这两个if体实际上就像then-else分支一样。它们会导致子进程打印其编号并退出旧的父进程,因此会出现一个进程瀑布,这些进程按顺序相互替换,其中大多数进程只作为子进程一次,然后作为父进程
您只需将其改写为:
for(i = 0; i < 10; i++) {
p = fork();
if (p == 0) {
print(i);
exit(0);
}
// In fact, you should place waitpid(...) somewhere here,
// otherwise the child will become a so called zombie process
// after its termination.
// Only after parent termination they all will be
// finally recycled by init (PID 1) generally using up your system's
// resources for indefinite time
}
现在你有了产生C0的p。C0打印其编号并立即退出,而P只是继续下一个循环迭代,创建C1,就像C0打印其编号并退出一样,依此类推。好吧,这是最初要求的
请注意,在现实生活中,您将不得不以某种方式处理-1返回值,该返回值指示fork调用中的某些错误,因此在我重写的第二个代码段中,可能不会执行if语句,为了简单起见,我省略了它们。请注意,在这个解决方案中,创建父进程的是您的shell。该父项根据请求创建10个子项。我不知道这是否正是你所需要的。希望是:
for(i = 0; i < 10; i++) {
p = fork();
if (p == 0) {
print(i);
exit(0);
}
// In fact, you should place waitpid(...) somewhere here,
// otherwise the child will become a so called zombie process
// after its termination.
// Only after parent termination they all will be
// finally recycled by init (PID 1) generally using up your system's
// resources for indefinite time
}