Linux环境 fork() 解析

一 基础知识

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;

实例:

/*************************************************************************
    > File Name: fork_test.c
    > Author: 
    > Mail: 
    > Created Time: 2016年06月06日 星期一 09时29分05秒
 ************************************************************************/
#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("child process| process id= %d | fpid= %d |parentid = %d \n",getpid(),fpid,getppid());   
            count++;  
        }  
        else {  
            printf("parent process| process id= %d | fpid = %d |parentid = %d\n",getpid(),fpid,getppid());   
            count++;  
        }
        printf("统计结果是: %d \n",count);  
        getchar();
        return 0; 
}  

这里写图片描述

fork出错可能有两种原因:
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
2)系统内存不足,这时errno的值被设置为ENOMEM。

二、fork进阶知识

实例

    #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("i=%d | child  ppid=%4d |pid=%4d |fpid=%4d \n",i,getppid(),getpid(),fpid);  
           else  
               printf("i=%d | parent ppid=%4d |pid=%4d |fpid=%4d  \n",i,getppid(),getpid(),fpid);  
       }        
       getchar();
       return 0;  
    }  

运行结果

这里写图片描述

查看进程

这里写图片描述

分析

Linux环境 fork() 解析

猜你喜欢

转载自www.linuxidc.com/Linux/2017-03/141558.htm