C语言fork函数机制图解

C语言fork函数机制图解

代码

/* 
 *  fork_test.c 
 *  version 2 
 *  Created on: 2010-5-29 
 *      Author: wangth 
 */  
#include <unistd.h>  
#include <stdio.h>  
int main(void)  
{  
   int i=0;  
   printf("i son/pa ppid pid  fpid/n");  
   //ppid指当前进程的父进程pid  
   //pid指当前进程的pid,  
   //fpid指fork返回给当前进程的值  
   for(i=0;i<2;i++){  
       pid_t fpid=fork();  
       if(fpid==0)  
           printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
       else  
           printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
   }  
   return 0;  
} 

输出结果

    i son/pa ppid pid  fpid
    0 parent 2043 3224 3225
    0 child  3224 3225    0
    1 parent 2043 3224 3226
    1 parent 3224 3225 3227
    1 child     1 3227    0
    1 child     1 3226    0 

运行图解

fork运行图解

fork函数原理:调用时复制该进程的所有数据到另一块内存区,创建新的进程,紧接着执行fork()后的下一行函数


流程解析:

  1. 第一次for循环,只有3224进程能够执行fork函数,fork出了3225进程
  2. 第二次循环,3224,3225都执行了fork函数,fork出了3226进程和3227进程,如图所示,总共被fork出的进程有3个,总共执行了6次printf
  3. 其他情况依此类推,初次被fork出的进程会直接执行fork()函数的下一句代码,避免递归fork,fork进程的变量值均为其父进程当前运行的变量值的复制,包括全局变量,因为整个进程状态都是即时拷贝的,包括父进程当前pc指针。

推荐阅读更多精彩内容

  • 引用:CSDN jason314 一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函...
    _Nullptr阅读 18,956评论 1 19
  • 1、fork函数简介 参考:https://www.jianshu.com/p/484af1700176 一个进程...
    王王王王王景阅读 1,058评论 0 0
  • 原文地址:http://www.cnblogs.com/bastard/p/2664896.html 一、fork...
    Caiaolun阅读 297评论 1 1
  • ——参考自《Python编程金典》   在并行执行的多个任务的应用程序中,创建新进程非常有用。例如,Apache ...
    H_fb4e阅读 1,293评论 0 0
  • 栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函...
    zjfclimin阅读 3,241评论 0 5