Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1496618
  • 博文数量: 148
  • 博客积分: 2234
  • 博客等级: 大尉
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 21:34
个人简介

未来很长。

文章存档

2017年(7)

2016年(4)

2015年(1)

2014年(6)

2013年(31)

2012年(99)

分类: C/C++

2012-05-23 20:32:32


点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. void do_something()
  4. {
  5.     printf("hello !i'm the child process!\n");
  6. }
  7. void main_dosomething()
  8. {
  9.     printf("hello!i'm the main\n");
  10. }
  11. void main()
  12. {
  13.     pid_t pid;
  14.     int i=0;
  15.     main_dosomething();
  16.     pid=fork();
  17.     switch(pid)
  18.     {
  19.         case 0:
  20.             do_something();
  21.         case -1:
  22.             printf("error!\n");
  23.             return ;
  24.         default:
  25.             printf("hi ,i'm the father process!\n");
  26.     }
  27. }

开始就是不明白为什么子进程不会调用main_dosomething()函数了,我就是认为所有的程序都是从main函数开始执行,所以理应子进程也应该从main函数执行,所以才错误的认为子进程会调用main_dosomething()函数。
哎呀,一直傻不拉几的以为,子进程会执行父进程所有的代码,就是我因为错误的理解了一句话“子进程是父进程的完全拷贝”,这句话,理解错的原因是因为认为拷贝只是简单的“父进程程序的拷贝”,其实子进程拷贝父进程,包括拷贝父进程的一切有关信息,包括状态信息,当然就有程序计数器PC也在内了,所以在父进程执行到fork的时候,它的程序计数器的PC内容绝对不会是从main函数开头执行的了,其实PC此时存放的是进程下一条要执行的指令地址,所以子进程总是从fork之后开始执行。
所以一定要正确的理解进程的“动态”,所谓的动态就是体现在这儿了。
但是子进程和父进程的数据段是独立的,代码段是共享的。
一个简单的想法就是:
fork确实创建了一个子进程并完全复制父进程,但是子进程是从fork后面那个指令开始执行的。
对于原因也很合逻辑,如果子进程也从main开头到尾执行所有指令,那它执行到fork指令时也必定会创建一个子子进程,如此下去这个小小的程序就可以创建无数多个进程可以把你的电脑搞瘫痪

所以fork作者肯定不会傻到这种程度
哎呀,纠结了一天的问题,终于豁然开朗了,心情就是爽!
阅读(7748) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

wenjavac2012-05-25 11:00:20

如果子进程也从main开头到尾执行所有指令,那它执行到fork指令时也必定会创建一个子子进程,如此下去这个小小的程序就可以创建无数多个进程可以把你的电脑搞瘫痪

我也是这么想的