Chinaunix首页 | 论坛 | 博客
  • 博客访问: 549706
  • 博文数量: 181
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-22 15:17
个人简介

用发呆的时间来理清自己的思绪

文章存档

2015年(7)

2014年(134)

2013年(40)

分类: 嵌入式

2014-06-22 11:18:24


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. /*******************************************************
  5.  * 1.fork之后子父进程的执行顺序由调度算法决定,即有OS决定
  6.  * 2.fork之后子父进程都是从fork的下一条语句开始执行,原因
  7.  * 是,子进程拷贝了父进程的一组寄存器的值,其中包括pc.
  8.  * 3.fork之后,父子进程的代码段共享,子继承拷贝父进程(1)
  9.  *      数据段、(2)堆栈段、(3)(缓冲)(4)打开的文件资源
  10.  *      (5)CPU中一组寄存器的值,比如pc指针的值
  11.  * 4.fork之后,父子进程各自拥有独立的4G地址空间(代码段共享)
  12.  * 此时,父子进程的虚拟地址相同,但是互不影响,因为映射到
  13.  * 不同的物理内存空间.
  14.  * 5.fork后子进程继承父进程打开的文件,即与父进程使用相同的
  15.  * 文件表项,共用相同的offset值.
  16.  *
  17.  * **************************************/

  18. //存放在data段,以静态方式存放,程序结束时释放空间
  19. int static_a = 10;

  20. int main(int argc, const char *argv[])
  21. {
  22.     pid_t pid = 0;

  23.     //存放在栈区,函数调用完之后自动释放空间
  24.     int stack_b = 20;

  25.     //堆区分配的空间,需手动释放
  26.     int *heap_c = (int *)malloc(sizeof(int));
  27.     *heap_c = 30;

  28.     if((pid = fork()) < 0)
  29.     {
  30.         perror("fork");
  31.         exit(-1);
  32.     }

  33.     else if(pid == 0)//child process
  34.     {
  35.         printf("the child process is running\n");

  36.         printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
  37.                 stack_b,*heap_c);

  38.         static_a = 100;
  39.         stack_b = 200;
  40.         *heap_c = 300;

  41.         printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
  42.                 stack_b,*heap_c);
  43.     }

  44.     else //(pid > 0) parent
  45.     {

  46.         sleep(3);//此处延时是为了让子进程先执行。

  47.         printf("the parent process is running\n");

  48.         printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
  49.                 stack_b,*heap_c);

  50.         static_a = 101;
  51.         stack_b = 201;
  52.         *heap_c = 301;

  53.         printf("static_a = %d stack_b = %d heap_c = %d\n",static_a,\
  54.                 stack_b,*heap_c);
  55.     }


  56.     return 0;
  57. }
运行结果:

点击(此处)折叠或打开

  1. litong@ltubuntu:~/exericse$ ./a.out
  2. the child process is running
  3. static_a = 10 stack_b = 20 heap_c = 30
  4. static_a = 100 stack_b = 200 heap_c = 300

  5. the parent process is running
  6. static_a = 10 stack_b = 20 heap_c = 30
  7. static_a = 101 stack_b = 201 heap_c = 301
      以上结果可以看出,父子进程各自拥有独立的4G地址空间,父子进程中修改各自的变量值并不会影响对方的变量值。
阅读(716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~