Linux环境 fork() 解析

来源:互联网 发布:数据分析与数据挖掘 编辑:程序博客网 时间:2024/05/01 23:17

一 基础知识

一个进程,包括代码、数据和分配给进程的资源。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;      }  

运行结果

这里写图片描述

查看进程

这里写图片描述

分析
这里写图片描述

0 0
原创粉丝点击