C 了解for循环中的fork()和exit()的用法

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调用不会创建一对新的进程父进程、子进程,而是离开原始进程父进程并创建另一个进程子进程,因此

嘿,我有一个关于fork的问题,以及它在for循环中的行为

因此,我提出以下问题:

创建一个父进程,创建10个子进程,每个子进程在for循环中打印实际的i值。这个代码正确吗

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
}