fork函数详解

2 篇文章 0 订阅

fork函数是Unix like系统都提供的有关操作系统进程处理的一个api。

fork函数可以获得一个与父进程一模一样的子进程,子进程获得父进程的数据空间和堆栈的一个副本。换句话说,二者并不共享内存,而是独立执行。

fork函数的最大特点是父进程的一次调用,可以有两个返回,一个是父进程中返回子进程的id,一个是在子进程中返回0,还有一种情况是fork错误:原因一是进程超过最大值,原因二是内存不足。

    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都

复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

     我们来看一个例子:

 

  1. /* 
  2.  *  fork_test.c 
  3.  *  version 1 
  4.  *  Created on: 2010-5-29 
  5.  *      Author: wangth 
  6.  */  
  7. #include <unistd.h>  
  8. #include <stdio.h>   
  9. #include <sys/types.h>
  10. int main ()   
  11. {   
  12.     pid_t fpid; //fpid表示fork函数返回的值  
  13.     int count=0;  
  14.     fpid=fork();   
  15.     if (fpid < 0)   
  16.         printf("error in fork!");   
  17.     else if (fpid == 0) {  
  18.         printf("i am the child process, my process id is %d/n",getpid());   
  19.         printf("我是爹的儿子/n");//对某些人来说中文看着更直白。  
  20.         count++;  
  21.     }  
  22.     else {  
  23.         printf("i am the parent process, my process id is %d/n",getpid());   
  24.         printf("我是孩子他爹/n");  
  25.         count++;  
  26.     }  
  27.     printf("统计结果是: %d/n",count);  
  28.     return 0;  
  29. }  

 

运行结果是:
    i am the child process, my process id is 5574
    我是爹的儿子
    统计结果是: 1
    i am the parent process, my process id is 5573
    我是孩子他爹
    统计结果是: 1


注意在windows下无法使用fork函数,此程序需要在安装有gcc编译器的unixl ike环境下使用。


写时复制

系统调用fork()创建进程的开始阶段可能不需要按需调页,这种技术提供了快速进程创建,且最小化新创建进程必须分配新的页面的数量。

fork()是将子进程创建为父进程的复制品。由于许多子进程在创建后通常马上会执行系统调用exec(),所以父进程地址空间的复制可能没有必要。使用一种称为写时复制(copy-on-write)的技术。这种方法允许父进程与子进程写时复制
系统调用fork()创建进程的开始阶段可能不需要按需调页,这种技术提供了快速进程创建,且最小化新创建进程必须分配新的页面的数量。
fork()是将子进程创建为父进程的复制品。由于许多子进程在创建后通常马上会执行系统调用exec(),所以父进程地址空间的复制可能没有必要。使用一种称为写时复制(copy-on-write)的技术。这种方法允许父进程与子进程开始时共享同一页面,这些页面标记为写时复制页,即如果任何一个进程需要对页进行写操作,那么就创建一个共享页的副本。子进程会修改其复制的页,而非父进程的页。进程修改的页才会被复制,所有非修改的页可为父进程和子进程所共享。注意只有可能修改的页才需要标记写时复制。开始时共享同一页面,这些页面标记为写时复制页,即如果任何一个进程需要对页进行写操作,那么就创建一个共享页的副本。子进程会修改其复制的页,而非父进程的页。进程修改的页才会被复制,所有非修改的页可为父进程和子进程所共享。注意只有可能修改的页才需要标记写时复制。



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值