快速理解 Linux 中 的 fork( ) 函数

ps: 如果有任何问题可以评论留言,我看到后会及时解答,评论或关注,您的鼓励是我分享的最大动力

      转载请注明出处:https://blog.csdn.net/qq_40938301/article/details/89103234

1、fork的作用:

     当一个进程调用fork( )函数时,会产生一个新进程(即子进程),而自己本身也还存在,作为父进程

     子进程相当于父进程的复制,拥有与父进程相同的数据结构(即 数据+数据空间),但数据结构并不是共享的,

     只有代码段是共享的。

     ps:共享的意思指用同一个数据结构,子进程、父进程改变该数据结构都会对他产生影响。具体可见下分析部分

     fork( ) 之后生成的父、子进程会分别执行fork语句之后的代码,因此需要通过fork的返回值区分自己是父进程还是子进程

     fork( ) 返回值是一个整型数 fpid,有3种情况

     (1) 父进程:  fpid = 子进程的pid ( fpid > 0)

     (2) 子进程:  fpid = 0

     (3) 创建失败: fpid < 0

2、实例分析

#include <unistd.h> 
#include <stdio.h>  
int main ()  
{  
    pid_t fpid; //fpid表示fork函数返回的值 
    int count=0; 
    fpid=fork();  
    if (fpid < 0)  
        printf("error in fork!");  
    else if (fpid == 0) { 
        printf("i am the child process, my process id is %d/n",getpid());  
        printf("子进程/n"); 
        count++; 
    } 
    else { 
        printf("i am the parent process, my process id is %d/n",getpid());  
        printf("父进程/n"); 
        count++; 
    } 
    printf("统计结果是: %d/n",count); 
    return 0; 
} 

    运行结果:

    i am the child process, my process id is 5574
    子进程
    统计结果是: 1
    i am the parent process, my process id is 5573
    父进程
    统计结果是: 1

    (1) fork出来的父子进程是并发的,执行的先后顺序是根据当前操作系统的调度算法决定的,并不一定。

          即可能 父进程先运行, 也可能 子进程先运行。

   

    (2) getpid( )可以获取当前进程的 进程号pid(process id)

         getppid( )可以获取当前进程的父进程的 进程号pid(parent process id)     

   

    (3) count 在 fork( ) 前被初始化为 0 

         因为数据相同但不共享,因此父子进程的 count 分别 ++ ,结果都为 1 。

    

    (4) 如果在父进程的代码中加入   

printf("my fpid is %d/n",fpid);  

        则结果为:

        my fpid is 5574

        因为父进程的 fpid 等于 新建的子进程的 pid    

发布了57 篇原创文章 · 获赞 12 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_40938301/article/details/89103234