#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()
。
但我不明白为什么。 在每个叉执行它下面的功能和参数?
因为第一叉将分成两个过程中,第二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()
在每个叉执行它下面的功能和参数?
是的,你可以从图中看到,当一个进程派生创建的过程(以及创建它的一个)继续上叉后的下一个指令执行。
当你调用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