免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3847 | 回复: 5
打印 上一主题 下一主题

fork函数创建子进程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-23 16:10 |只看该作者 |倒序浏览
int main
{
  p=fork();
  if(p==0)
  {
     ...
     sleep(2);
     ...
  }
  else if(p>0)
  {
      ...
  }
}

是不是fork之后系统就进行了进程调度,并用传值给p来表明当前进程是在子进程还是父进程。如果进程在子进程当中,调用sleep(2)来挂起同时进程调度到父进程,但是父进程的代码段也是从fork()之后开始,之前p==0父进程怎么进入刀else if(p>0)里面执行呢?
是不是调用sleep(2)又有什么因素使得p>0

论坛徽章:
0
2 [报告]
发表于 2009-05-23 16:19 |只看该作者
fork()返回两次,再子进程返回一次,在回到父进程的同时在返回一次,凡是此时的程序段在if else那里而对p的赋值在之前,返回刀父进程的时候没有返回的值这么样赋值给p,跳到else里面呢?

论坛徽章:
0
3 [报告]
发表于 2009-05-23 18:26 |只看该作者

re

fork()进去成功时产生子进程,子进程的代码和父进程是一模一样的;只是各有task struct;这点在理解写时拷贝时就很好理解了;

刚接触linux 往往很难理解fork返回两次,觉得很怪;
是fork成功时,逻辑上就有了很奇怪的fork:一个入口,在时间上分两次出来(因为两个进程虽共享fork()中部分内核态代码,但各有各的栈);
子进程的fork返回0
父进程的fork返回子进程id,如果失败则返回值小于0;

[ 本帖最后由 tonylulu 于 2009-5-23 18:45 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-05-24 22:07 |只看该作者

回复 #1 shushi0123 的帖子

fork使得一个子进程被生成出来,fork返回时对父进程和子进程设置了不同的返回值(eax),而且父子进程被分别调度,不一定谁先谁后

论坛徽章:
0
5 [报告]
发表于 2009-05-24 22:23 |只看该作者
原帖由 shushi0123 于 2009-5-23 16:10 发表
int main
{
  p=fork();
  if(p==0)
  {
     ...
     sleep(2);
     ...
  }
  else if(p>0)
  {
      ...
  }
}

是不是fork之后系统就进行了进程调度,并用传值给p来表明当前进程是在子进 ...

这个需要明白程序的运行空间的,每一个程序执行的时候都会被分配一段空间,程序所有的操作都是在这段内存空间内的,包括数据堆栈等,而fork的操作就是复制这段空间,这样
子进程和父进程都有各自的运行空间了,
可以这么认为:
fork之前,
+++++++++
++             ++
+++++++++  
fork滞后:
+++++++++
++     父进程        ++
+++++++++  


+++++++++
++     子进程   ++
+++++++++

论坛徽章:
0
6 [报告]
发表于 2009-05-24 22:49 |只看该作者
3楼正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP