linux中fork()函数详解

 1、fork入门

计算机程序设计中的分叉函数。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。

fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了

该应用程序的两个副本。

  需要注意的是:(1)当调用fork()函数时,在该位置进程一分为二,一个是父进程,一个是子进程。(2)若调用成功返回的是两个值,父进程返回的值为子进程标志,子进程返回的值为0,不成功返回为-1。

  为什么成功调用会返回两个值?由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

   每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。

  子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。下面看一个简单的例子:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int main()
 6 {
 7     pid_t pid = fork();
 8     if(pid < 0)
 9         printf("error");
10     else if(pid == 0)
11         printf("this is child
");
12     else
13         printf("this is parent
");
14     return 0;
15 }
View Code

  输出:this is parent

              this is child

  至于父进程和子进程哪个先执行,这和操作系统和调度算法有关,其实这个问题在实际应用中并不重要。

 2、fork进阶

  看一下一个例子。

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int main()
 6 {
 7     int i = 0;
 8     for(i = 0; i < 3; i++)
 9     {
10         fork();
11         printf("hello world
");
12     }
13     return 0;
14 }
View Code

   运行的时候一共输出14个hello world。

   当i = 0的时候,一共2个进程,输出2个hello world, 当i=1时,2个进程变成4个,这时输出4个hello world,当i=2时,4个进程变成8个,这时输出8个hello world,一共输出2+4+8=14个hello world。当循环n次时,就输出2(1 + 2 + 2n-1)个。

 

原文地址:https://www.cnblogs.com/Hxinguan/p/5006628.html