Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4463351
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: LINUX

2011-09-20 11:27:24

    在执行过程中,fork()和vfork()函数有一定的区别,fork()函数是拷贝一个父进程的副本,从而拥有自己独立的代码段、数据段(.data .bss) 以及堆栈空间,即成为一个独立的实体。而vfork()是共享父亲进程的代码以及数据段(.data .bss .rodata)。

   
   
   在下面的程序中, 定义了 全局已经初始化的变量glob(.data)和 全局未初始化变量 glox(.bss), 在main中的局部变量var(.stack),常量("hello linux")
   
    使用vfork新建一个新的进程,在子进程中分别修改这些变量,然后打印这些变量,在父进程中 打印这些变量,发现:
    子进程和父进程中的变量都是一样的

说明:
    使用vfork()产生的 子进程是共享父进程的 数据段(.rodata .data. .bss)和代码段 


    如果将vfork()修改为 fork(),发现 父进程和子进程中的数据变量是一样的。 说明: fork()是拷贝父进程的副本 


  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <errno.h>

  6. int glob = 6;//glob in .data
  7. int glox; //not init in .bss
  8. int main(int argc, char *argv[])
  9. {
  10.     int var = 88; //local varliable in .stack
  11.     char str[12] = "hello linux!"; // hello linux in .rodata
  12.                                        // str in .stack
  13.     pid_t pid;
  14.     printf("in beginging the glob is %d, the local var is %d glox=%d\n",glob,var,glox);
  15.     printf("in beginging the str is %s\n\n",str);

  16.     if((pid = vfork())<0)
  17.     {
  18.         perror("vfork");
  19.         exit(EXIT_FAILURE);
  20.     }
  21.     else if(pid == 0)
  22.     {
  23.         printf("child ++glob=%d,++var=%d ++globx=%d\n",++glob,++var,++glox);
  24.         str[0] = '2';
  25.         printf("child str changed %s\n\n",str);
  26.         exit(EXIT_SUCCESS);
  27.     }
  28.     else
  29.     {
  30.         printf("parent glob=%d,var=%d glox=%d\n",glob,var,glox);
  31.         printf("parent str %s\n",str);
  32.         exit(EXIT_SUCCESS);
  33.     }
  34. }

  1. ywx@ywx:~/Desktop/yu/process$ ./test1
  2. in beginging the glob is 6, the local var is 88 glox=0
  3. in beginging the str is hello

  4. child ++glob=7,++var=89 ++globx=1
  5. child str changed 2ello

  6. parent glob=7,var=89 glox=1
  7. parent str 2ello 




阅读(1746) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~