天天看点

linux 中 fork()函数详解

 一、fork入门知识

     一个进程,就是程序的执行过程,包括代码、数据和分配给进程的资源。在linux 中 fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是克隆了一个自己。

一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

二、fork函数

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

    1)在父进程中,fork返回新创建子进程的进程ID;

    2)在子进程中,fork返回0;

    3)如果出现错误,fork返回一个负值;

    在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

    引用一位网友的话来解释fpid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id,因为子进程没有子进程,所以其fpid为0。

三、具体示例

这是一段 C代码程序:

#include <unistd.h> 
#include <stdio.h>  
int main ()  
{  
    int  fpid; //fpid表示fork函数返回的值 
    int count=0; 
    fpid=fork();  
    if (fpid < 0)  
        printf("error in fork!\n");  
    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 parent process, my process id is 2947

我是孩子他爹

统计结果是: 1

i am the child process, my process id is 2948

我是爹的儿子

统计结果是: 1 

四、代码思路:

首先是,父进程 2947 指行到  fork() 函数,创建了一个可以并发执行的子进程,返回值为子进程的id号,所以就进入else语句,count ++ 之后 输出 为 1。

然后是 父进程执行完成之后,子进程开始执行(将父进程的代码完全copy了一份), id 号 为 2948,所以 int count =0 再次执行了一遍,fork()的返回值为0,进入了 else if (fpid == 0) 的语句,count++ 之后,输出 1。

最后进程执行结束,父子进程都执行结束。

继续阅读