linux中fork()函数详解

来源:互联网 发布:软件企业评估规范 编辑:程序博客网 时间:2024/05/13 21:27

fork函数原型如下: 

pid_t fork(void);

       fork函数的功能:创建一个子进程

       fork函数的特性:调用一次却返回两次

  返回值:

       零:在子进程中,fork()返回0

  正数:在父进程中,fork()返回正的子进程的PID

  负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。

            fork出错可能有两种原因:

               (1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。

               (2)系统内存不足,这时errno的值被设置为ENOMEM。

--------------------------------------------------------------------------------------------------------------------------------------

一个程序一旦调用fork函数,系统就新建了一个子进程,并在子进程和父进程中返回,

父子进程从fork以后的代码开始执行,但是子进程也复制了父进程fork执行点的所有上下文场景,

包括:

       ——全局和局部变量

  ——打开的文件句柄

  ——共享内存、消息等同步对象

子进程复制了父进程的堆栈段和数据段,和父进程共享相同的代码段。

demo如下:--------------------------------------------------------------------------------------------

#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
main()
{
  printf("test runtimes\n");
  int b=20;
  if(fork())
  {
     printf("i am parent process pid=%d,ppid=%d,b=%d\n",getpid(),getppid(),b);
     b=80;
     sleep(2);
     printf("after sleep parent process b=%d\n",b);
  }else{
    printf("son process pid=%d,ppid=%d,b=%d\n",getpid(),getppid(),b);
    sleep(2);
  }
  printf("pid=%d,ppid=%d,b=%d\n",getpid(),getppid(),b);
}

运行结果如下:-----------------------------------------------------------------------------

test runtimes
i am parent process pid=3659,ppid=2103,b=20
son process pid=3660,ppid=3659,b=20
after sleep parent process b=80
pid=3659,ppid=2103,b=80
pid=3660,ppid=1,b=20
结论如下:

1.printf("test runtimes\n");只运行了一次,进程从fork后一行code执行。

2.父进程和子进程数据段相互独立。

3.有几个进程,后面的公共代码就执行几次。  

原创粉丝点击