fork 嵌套循环

标签 fork parent-child nested-loops child-process

有人可以解释一下这个程序创建了多少个子进程吗? 答案是127,但我不明白他们是怎么得到的。

int create(int num){
int i;
for(i=0;i<num;i++)
fork();
}

int main() {
int i;
fork();
for(i=0;i<4;i++)
create(i);
return 0; 
}

最佳答案

这听起来确实像是操作系统类(class)的作业问题,但这是一个有趣的问题,所以我会为您解答。首先,我们看一下代码,如下所示。从功能上来说,这是一样的,但它会让事情更容易理解。另外,首先,让我们忽略最初的 fork()称呼。如果不存在,我们将计算有多少个,然后如果我们将其添加回来,我们将拥有相同数量的进程,乘以两倍。

int main() {
    int i, j;
    // fork();
    for (i = 0; i < 4; i++) {
      for (j = 0; j < i; j++) {
        fork();
      }
    }
}

现在这部分是一个数学问题,部分是一个编程问题。首先,我们需要了解当我们调用 fork() 时会发生什么。当您创建子进程时,子进程会继承其自己的所有父进程变量的副本(在 fork() 时变量的当前值)。已调用电话。因此,这意味着现在,父级和子级拥有具有完全相同值的完全相同变量的副本,但它们可以独立修改这些变量,并且不会相互影响。那么在下面的简单示例中,

int main() {
    int i = 0, pid = fork();

    if (pid == 0) {
      i = 1;
    }

    if (pid > 0) {
      i = 2;
    }
}

在 parent 的世界里,i得到值2,在 child 的世界里i获取值 1,这些现在是我们正在讨论的单独变量,因此父级可以拥有它想要的,子级也可以拥有它想要的,它们不会发生冲突,并且每个人都高兴。

现在,为了回答您的问题,我们必须牢记这一点。因此,让我们看看在没有初始 fork() 的情况下,我们首先有多少个进程。称呼。现在,父进程本身将生成 6 个子进程。对于每个进程,变量 (i,j)将分别具有值 (1,0)、(2,0)、(2,1)、(3,0)、(3,1) 和 (3,2)。

因此,在 (3,2) 处生成的最后一个子级将退出循环,并且不会生成更多子级。然后,在 (3,1) 处生成的子级将继续 for 循环,增量 j ,生成另一个进程,然后两个子进程都会看到 (i,j)在(3,2)处,退出for循环,然后死亡。然后我们在 (3,0) 处由父级生成了另一个子级。现在,这个 child 将继续执行 for 循环,在 (3,1) 和 (3,2) 处生成一个 child ,然后死亡,然后在 (3,1) 处生成的这个新 child 将生成另一个 child ,然后它们会死的。我认为我们可以看到这开始变得相当复杂,因此我们可以用下图来表示这种情况。

enter image description here

图中的每个顶点代表一个进程,标记为p的顶点是父进程。每条边上的有序对表示 (i,j) 的值子进程产生的时间。请注意我们如何对流程进行分组。在第一组中,我们有 1 个进程,接下来有 ​​2 个进程,接下来是 4 个进程,然后是 8 个进程,现在我们应该看看事情进展如何。下一组将有 16 个进程,下一组将有 32 个进程。因此,如果我们计算所有进程(包括父进程),我们将有 64 个进程。到目前为止有意义吗?

现在让我们输入首字母 fork()这将导致我们刚才描述的完全相同的情况发生两次,这将给我们总共 128 个进程,包括父进程,这意味着我们已经生成了 127 个子进程。

所以是的,一半是数学问题,一半是编程问题。让我知道您的问题。

您可以将第一个循环重写为 for (i = 1; i <= n; i++) 。那么我很确定我们可以说,一般来说,您的父进程将生成 children ,在哪里

关于fork 嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39531425/

相关文章:

c - 有多个 fork 和额外的打印品

c++ - 开始 pty 询问登录凭据

c - 我的嵌套循环打印的行比想要/预期少了一行

python - 如何使用独立的 stdout、stderr 和 stdin fork 一个新进程?

c - fork 后在子进程中设置 errno - OSX

c# - Lightswitch 在 C# 中循环遍历子记录

HTML 子项出现在父项后面

java - 一对多单向父子ID级联保存

javascript - 如何在backbone.js中展平嵌套模型?

java - 嵌套循环打印一个数字,旁边有相同数量的星号