了解叉()命令的Posix API(Understanding the fork() command

2019-10-21 05:24发布

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

当工作fork() ,为什么它打印16 *的?

据我所知, fork()生成一个新的子进程,这两个执行这可以解释为什么一个叉产生2星,但是,它打印16,我可以看到,它与每个双打四面叉同一进程fork()

但我不明白为什么。 在每个叉执行它下面的功能和参数?

Answer 1:

因为第一叉将分成两个过程中,第二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()

在每个叉执行它下面的功能和参数?

是的,你可以从图中看到,当一个进程派生创建的过程(以及创建它的一个)继续上叉后的下一个指令执行。



Answer 2:

当你调用fork(),它创建一个新的进程。 您复制您的应用程序,然后在2个应用程序继续运行和后叉执行新指令()调用

printf("i'm the main thread\n");
fork();
printf("i'm executed 2 times\n");
fork(); //this fork is so executed 2 times, so 2 new processes, so 4 processes for all
printf("i'm excecuted 4 times\n");
fork(); //this fork is executed 4 times to ! So you have now 8 processes;
// and etc ..
fork(); //this fork is executed 8 times, 16 process now !
printf("*"); // executed 16 times

新工艺叉()之前的所有共享内存,老改变状态是当前线程。 如果你想要做取决于进程anothers的事情:

pid_t p;
int i = 1;
p = fork();
if(p == 0)
{
    printf("I'm the child\n");
    i = 2;
    exit(0); //end the child process
 }
 printf("i'm the main process\n");
 printf("%d\n", i); //print 1


文章来源: Understanding the fork() command Posix API
标签: c posix