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

时间:2018-05-17 12:43:10

标签: c process fork

嗨我对for以及它在i循环中的行为方式有疑问。

所以跟我问:

创建一个父进程,创建10个子进程,每个进程在for循环中打印实际的int i; for(i=0;i < 10;i++){ if(fork()==0){ print(i); } exit(0); } 值。这段代码是否正确?

i

我的理解是,这段代码在每个循环迭代中创建一个父项和一个子项,其中父项直接终止,子项打印i;

因此,为了让每个父母和10个孩子都打印exit(0),我应该像这样包裹int i; int p; for(i=0;i < 10;i++){ if((p=fork())==0){ print(i); } if(p > 0){ exit(0); } }

'academy' => [
        'driver' => 'local',
        'root' => storage_path('app/academy'),
    ],

有人可以确认或者这是否正确,或者帮助我更好地理解它是否错误。

谢谢:)

1 个答案:

答案 0 :(得分:0)

fork()调用不会创建一对新进程(父进程,子进程),但保留原始进程(父进程)并创建一个另一进程(子进程),因此它“返回”两次”。

在你的第一个片段中,你真的只有一个父母。唯一的问题是,它在第​​一次迭代时完成。 :)

看:i = 0,现在我们只有父进程(称之为P)。 P输入fork()并保留两次:P(返回子项的PID)和新创建的子C0(返回0)。然后,根据if语句,C0打印0P不执行任何操作。然后执行路径收敛,PC0都退出。现在我们根本没有我们的流程。

您的第二个片段循环体可以按如下方式重写:

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
}

现在您有P创建C0C0打印其编号并立即退出,而P只是继续下一个循环迭代,创建C1,就像C0打印其编号并退出一样,依此类推。 AFAIK是最初要求的。

请注意,在现实生活中,您必须以某种方式处理-1返回值,该值指示fork()调用中的某些错误(所以实际上,在我重写的第二个片段中有一个<{1}}语句不会执行的可能性,为简单起见,我省略了它们。