理解fork()命令Posix API

Sha*_*owX 1 c posix

#include<iostream>
#include<unistd.h>
#include<stdio.h>
using namespace std;
int main()
{
    fork();
    fork();
    fork();
    fork();
    printf("*"); /*This prints 16 stars*/ 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在使用时fork(),为什么打印16*?

据我所知,fork()生成一个新的子进程,它们都执行相同的进程,这可以解释为什么一个fork生成2个星,但是,有四个forks它打印16个,我可以看到它每个都加倍fork().

但我不明白为什么.每个fork是否执行下面的函数和参数?

rob*_*bmj 5

因为第一叉将分成两个过程中,第二fork()呼叫将被本两个过程被调用,这些分裂两个过程进入4.这将继续下去,直到所有的叉()调用被称为在每个过程.所以你最终2^4 = 16打电话给printf("*")

在"图表"中,每个条形表示调用函数时正在执行的进程数.所以函数执行的次数与条数一样多.

       |   fork()             // The first processes creates a second (2 total)
       |   fork()    |        // Those 2 processes start 2 more       (4 total)
      ||   fork()    ||       // Those 4 processes start 4 more       (8 total)
    ||||   fork()    ||||     // Those 8 processes start 8 more       (16 total) 
||||||||  printf()   |||||||| // resulting in 16 calls to printf()
Run Code Online (Sandbox Code Playgroud)

每个fork是否执行下面的函数和参数?

是的,正如您从图中可以看到的,当一个进程分叉创建的进程(以及创建它的进程)继续执行fork之后的下一条指令.