关于fork()函数的一点思考

关于fork()函数的一点思考

最近看操作系统的进程部分,对fork()函数的有些疑惑,于是查书本,看博客,花了一晚上时间研究了一下fork()的执行过程,终于有了一些收获。
fork()对初学者来说还是比较容易混淆的,特别是当多个fork连着用时。要想弄清楚fork的执行过程,首先要明白fork的重要特性。
fork()是一个创建进程的函数,新创建的子进程相当于父进程的一份拷贝,之前的各种变量都是与父进程相同的;fork()被父进程调用一次返回两次,一次是在父进程中返回子进程的PID,另一次是在子进程中自己给自己返回0;还有一个很重要特性是父进程与子进程是同时运行的,一旦子进程被创建,他们的运行不存在先后顺序,因为操作系统会根据进程调度算法来交替执行各种进程;所以可以不用在意执行结果的先后顺序。
了解了上面三点,就可以找到看懂fork()程序的方法了。画进程图是一个很好的方法,子进程所执行的操作基本和创建它父进程所执行的操作一样,只是子进程返回0改自己罢了,所以进程图有点像数学中的分形,每执行一次fork,就相当于在父进程和子进程都分形一次。画图时可以把父进程先画出,再在子进程复制一份,具体进程图分形可参考CSAPP的P494页。
程序实例:参考:点击打开链接
<span style="font-size:18px;">#include "stdio.h"
#include "sys/types.h"
#include "unistd.h"
 
int main()
{
    pid_t pid1;
    pid_t pid2;
 
    pid1 = fork();
    pid2 = fork();
 
    printf("pid1:%d, pid2:%d\n", pid1, pid2);
}</span>
参考:点击打开链接
/* 
 *  fork_test.c 
 *  version 3 
 *  Created on: 2010-5-29 
 *      Author: wangth 
 */  
#include <unistd.h>  
#include <stdio.h>  
int main(void)  
{  
   int i=0;  
   for(i=0;i<3;i++){  
       pid_t fpid=fork();  
       if(fpid==0)  
           printf("son/n");  
       else  
           printf("father/n");  
   }  
   return 0;  
  
}  
进程图:


猜你喜欢

转载自blog.csdn.net/shhchen/article/details/52022384