免费注册 查看新帖 |

Chinaunix

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

简单讲下关于fork和exec [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-23 22:31 |只看该作者 |倒序浏览
我在这个论坛里看到,许多朋友对fork和exec调用概念比较模糊,下面我简单描述下这方面的知识。
学过C语言的都知道,Unix下某个进程的内存分成三部分:代码段,堆栈段,数据段。代码段用来存放程序运行的代码,堆栈段用来存放子程序的局部变量,数据段用来存放全局变量。这在perl里也是一样的。
perl的fork调用,跟C的一样,当发生fork调用时,实际上发生如下事:
父进程将代码段,堆栈段,数据段完全复制一份给子进程。也就是说,在子进程运行之初,它拥有父进程的一切变量和句柄。例如,父进程申明了某个hash表,那这个hash表也会被子进程拥有。
然而,一旦子进程开始运行,它的数据段和堆栈段就在内存里完全和父进程分离开了。也就是说,两个进程间不再共享任何数据。例如前面所说的hash表,虽然子进程从父进程处继承了这个数据结构,但子进程写往hash里的数据,不会被父进程访问到。在shell里用ps命令,可以看到2个独立运行的进程。通常你kill掉1个,不会影响另1个的运行。
那么父进程和fork出来的子进程如何通信呢?父进程和子进程间的通信有多种方法,最常见的是信号,另外还有管道,Socket,消息队列等,不在这里详叙。而2个进程间共享数据的办法,可以用线程或共享内存,我对这方面不熟悉。
如果大概明白了fork,那么exec就容易理解了。一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。
在perl里,调用exec后,原进程就完全消失,由于消失了,它也就不会从新进程接受到任何返回值,除非新进程意外终止,原进程会接受到错误值。

简单讲到这里,如有不当,请指出,

论坛徽章:
0
2 [报告]
发表于 2005-08-23 23:23 |只看该作者

简单讲下关于fork和exec

父进程和子进程间的通信有多种方法,最常见的是信号,另外还有管道,Socket,消息队列等,不在这里详叙。而2个进程间共享数据的办法,可以用线程或共享内存,我对这方面不熟悉。

父子进程通信还可以使用油槽和unix本地套接字.
2个进程通信共享数据主要是IPC(msg, sem, mem), 还有命名管道,socket和RPC.
兰花仙子提到的在两个进程间用线程来通信, 大惑不解, 能否举例或详细说明?

论坛徽章:
0
3 [报告]
发表于 2005-08-23 23:32 |只看该作者

简单讲下关于fork和exec

原帖由 "rorot" 发表:

父子进程通信还可以使用油槽和unix本地套接字.
2个进程通信共享数据主要是IPC(msg, sem, mem), 还有命名管道,socket和RPC.
兰花仙子提到的在两个进程间用线程来通信, 大惑不解, 能否举例或详细说明?


这里我的意思写错了,我是指多线程间可以共享数据,与进程无关,:)

论坛徽章:
0
4 [报告]
发表于 2005-08-24 11:37 |只看该作者

简单讲下关于fork和exec

都是高手啊~!向你们学习:)

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
5 [报告]
发表于 2005-08-24 12:20 |只看该作者

简单讲下关于fork和exec

霹雳跨拉鼓鼓掌,兰花妹子好象很热心哦

论坛徽章:
0
6 [报告]
发表于 2005-08-24 17:18 |只看该作者

简单讲下关于fork和exec

兰花仙子是高手耶,而且十分热心,几乎每个帖子都可以看到她的身影。
支持仙子。

论坛徽章:
0
7 [报告]
发表于 2005-08-24 17:30 |只看该作者

简单讲下关于fork和exec

原帖由 "marsbible" 发表:
兰花仙子是高手耶,而且十分热心,几乎每个帖子都可以看到她的身影。
支持仙子。


谢谢哦,不过我可不是高手,大家共同提高的。

论坛徽章:
0
8 [报告]
发表于 2005-08-25 10:32 |只看该作者

简单讲下关于fork和exec

谢谢

不过有一点我始终搞不清楚,例如下面的程序:
$procid = fork();
if ($procid == 0) {
  # this is the child process
  print ("this line is printed first\n";
} else {
  # this is the parent process
  print ("this line is printed last\n";
}

父/子进程会各返回一个pid,但为什么if语句和else语句都会执行,这就意味着这里的if语句被执行了两次,搞不清楚到底程序被编译成啥样的?
而且好象有时父进程返回的pid是子进程的实际pid数减1,什么原因?

论坛徽章:
0
9 [报告]
发表于 2005-08-25 12:25 |只看该作者

简单讲下关于fork和exec

原帖由 "huangsongsha" 发表:
谢谢

不过有一点我始终搞不清楚,例如下面的程序:
$procid = fork();
if ($procid == 0) {
  # this is the child process
  print ("this line is printed first\n";
} else {
  # this is the parent p..........



因为程序的if,else的代码段对父,子进程是相同的,所以能够编译;但由于在2个不同的进程里,代码各自在自己的内存地址里编译也不会冲突呀。
我不太清楚你说的返回子进程PID-1的情况,

论坛徽章:
0
10 [报告]
发表于 2005-08-25 14:34 |只看该作者

简单讲下关于fork和exec

谢谢啦,你一说我就清楚了

我的父进程返回有时是子进程的PID,有时又是减1,暂时不影响,以后再说

兰花仙子原来8月22日才注册的阿,牛
看来俺还很幸运,来了就遇到这么多热心人
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP