无法理解fork()输出

Ale*_*oft 4 c fork pid

我们假设有一个进程,PID = 1它运行以下代码:

int a = fork();
int b = fork();
printf(“a: %d, b: %d\n”, a, b); 
Run Code Online (Sandbox Code Playgroud)

让我们进一步假设,新的PID旨意被赋予一个接一个,如此发出第二个PID2,然后3

可能的输出是:

a:2, b:3
a:2, b:0
a:0, b:4
a:0, b:0
Run Code Online (Sandbox Code Playgroud)

我有一些麻烦试图理解上面代码的输出,尤其是为什么a:0, b:4a:2, b:3.

rpa*_*ani 13

你知道的

返回值是子项中的零和父项中子项的process-id号,或者出错时为-1.

那么,让我们一步一步地看到这里发生了什么.

fork()被调用时,它会创建id为一个新的子n,然后在孩子返回0和家长n.

因此,假设我们的进程为pid 1,当第一个fork()被调用时,它会创建一个带有pid的进程2,然后返回一个值.a0在过程2(子)中具有价值,并且将2在过程中具有价值1(父母).

然后,每个进程都将调用fork()b在父进程中分配返回值.在孩子身上,b会有价值0.

无论如何,我认为这个架构将简化理解:

主要开始:

|
|
int a = fork(); // It creates a new process, and the old one continues going
|
|-------------------------|
a = 2; /* Parent */       a = 0; // Child
|                         |
|                         |
int b = fork();           int b = fork(); // Each one create a new process
|                         |
|                         |-----------------------------|
|                         /* Child -> Parent */         // Child -> Child
|                         a = 0; b = 4;                 a = 0; b = 0
|
|
|
|
|-----------------------------|
/* Parent -> Parent */        // Parent -> Child
a = 2; b = 3;                 a = 2, b = 0; 
Run Code Online (Sandbox Code Playgroud)