现在的位置: 首页 > 综合 > 正文

fork函数

2013年01月20日 ⁄ 综合 ⁄ 共 1943字 ⁄ 字号 评论关闭

http://blog.csdn.net/kunp/article/details/351533


f o r k创建的新进程被称为子进程( child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程I
D
。将子进程I D返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程I Df o r k使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用g
e t p p i d
以获得其父进程的进程I D (进程ID 0总是由交换进程使用,所以一个子进程的进程I D不可能为0
)

       子进程和父进程共享很多资源,除了打开文件之外,很多父进程的其他性质也由子进程继承:

• 实际用户I D、实际组I D、有效用户I
D
、有效组I D

• 添加组I D

• 进程组I D

• 对话期I D

• 控制终端。

• 设置-用户- I D标志和设置--
I D
标志。

• 当前工作目录。

• 根目录。

• 文件方式创建屏蔽字。

• 信号屏蔽和排列。

• 对任一打开文件描述符的在执行时关闭标志。

• 环境。

• 连接的共享存储段。

• 资源限制。

       父、子进程之间的区别是:

• fork的返回值。

• 进程I D

• 不同的父进程I D

• 子进程的t m s _ u t i m e , t m s _ s t i m e , t m s _ c u t i m e以及t m
s _ u s t i m e
设置为0

• 父进程设置的锁,子进程不继承。

• 子进程的未决告警被清除。

• 子进程的未决信号集设置为空集。

       使f o r k失败的两个主要原因是:( a )系统中已经有了太多的进程(通常意味着某个方面出了问题),或者(
b )
该实际用户I D的进程总数超过了系统限制。回忆表2 - 7,其中C H I L D _ M A X规定了每个实际用户I
D
在任一时刻可具有的最大进程数。

       f o r k有两种用法:

(1) 一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待委托者的服务请求。当这种请求到达时,父进程调用f o r k,使子进程处理此请求。父进程则继续等待下一个服务请求。

(2) 一个进程要执行一个不同的程序。这对s h e l l是常见的情况。在这种情况下,子进程在从f o r k返回后立即调用e
x e c

在父进程中分配的内存在子进程中也继承过来, 看下面的例子


#include <stdio.h>
#include <unistd.h>




int **a;
int b = 3;
int main()
{
   int pid;
   int i;
   int j;


   a = malloc(2*sizeof(int*));
   
   for(i = 0; i < 2; i++)
   {
       a[i] = malloc(3*sizeof(int));
 
   }


   a[0][0] = 1;
   a[0][1] = 2;
   a[0][2] = 3;
   a[1][0] = 4;
   a[1][1] = 5;
   a[1][2] = 6;
   
   pid = fork();
   
   switch(pid)
   {
      case 0:
          child();
          return 1;
          
      default:
        break;    
   }


   b = 9;


   printf("b = %d\n", b);


  for(i = 0; i < 2; i++)
  { 
     for(j = 0; j < 3; j++)
     {
         printf("parent %d \n", a[i][j]);
     }
  }


   printf("parent a[0] %p\n", a[0]);


   printf("parent a[1] %p\n", a[1]);


   sleep(15);
   
   return 1;


}


int child()
{
 int i, j;


  printf("b = %d\n", b);
  sleep(5);


  printf("b = %d\n", b);
  
  for(i = 0; i < 2; i++)
  {
     for(j = 0; j < 3; j++)
     {
         printf("child %d \n", a[i][j]);
     }
  }


   printf("child a[0] %p\n", a[0]);


   printf("child a[1] %p\n", a[1]);


 
  sleep(5);
  
  return 1;


}


                                                    

程序执行结果

b = 9
parent 1 
b = 3
parent 2 
parent 3 
parent 4 
parent 5 
parent 6 
parent a[0] 0x8b76018
parent a[1] 0x8b76028
b = 3
child 1 
child 2 
child 3 
child 4 
child 5 
child 6 
child a[0] 0x8b76018
child a[1] 0x8b76028

抱歉!评论已关闭.