0

此代码的进程创建树是什么(假设所有分叉都成功)?

if(fork())
    fork();
n = 3;
for(i=1;i<n;++i)
{
    if(pid = fork())
        break;
} 

这是我尝试过的:

        [0]
         |
         /\
     [1]    [1]
      |      |
     [2]    [2]
      |      |
     [3]    [3]
      |
     [4]

但这甚至不是选择之一!任何帮助表示赞赏。

4

1 回答 1

0

第一行:

if (fork())

在这个fork之后,有两个进程,父进程和子进程。在父级中,fork() 返回非零值。在孩子中,fork() 返回零。这意味着下一行将仅在父级中运行。

    fork();

父级再次分叉。现在有三个进程,这三个进程都将运行其余的代码。

for(i=1;i<n;++i)
{
    if(pid = fork())
        break;
}

首先,i=1。这三个进程中的每一个都创建一个子进程,看到一个非零结果,然后跳出循环。这样就完成了原来的三个过程。但孩子们会继续前进。

下一次循环,i=2。同样的事情也会发生。三个子进程中的每一个都派生出一个自己的子进程,看到一个非零结果,然后中断。三个新的孩子将继续前进。

依此类推,直到 i=n-1。

我将不再尝试 ASCII 艺术,但生成的树看起来有点像某个熟悉的银器......

于 2012-09-26T15:43:05.417 回答