LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1036|回复: 6

vfork与fork的疑问

[复制链接]
发表于 2006-4-30 11:04:47 | 显示全部楼层 |阅读模式
我在看《unix环境高级编程》第146页,也就是第八章进程控制,书上说当vfork的子进程调用exit的时候,回把父进程所有打开的描述符都关闭,可是我在我的debian上实验的时候,发现并不是这样啊。
高手帮忙啊!谢谢!
发表于 2006-4-30 14:53:49 | 显示全部楼层
大家可否说说啊
回复 支持 反对

使用道具 举报

发表于 2006-4-30 17:12:52 | 显示全部楼层
有些系统有一个系统调用‘vfork()’,它最初被设计成‘fork()’的较少额外支出 (lower-overhead)版本。因为‘fork()’包括拷贝整个进程的地址空间,所以非常 “昂贵”,这个‘vfork()’函数因此被引入。(在3.0BSD中)(译者注:BSD: Berkeley Software Distribution)

*但是*,自从‘vfork()’被引入,‘fork()’的实现方法得到了很大改善,最值得注意的是“写操作时拷贝”(copy-on-write)的引入,它是通过允许父子进程可访问相同物理内存从而伪装(fake)了对进程地址空间的真实拷贝,直到有进程改变内存中数据时才拷贝。这个提高很大程度上抹杀了需要‘vfork()’的理由;事实上,一大部份系统完全丧失了‘vfork()’的原始功能。但为了兼容,它们仍然提供 ‘vfork()’函数调用,但它只是简单地调用‘fork()’,而不试图模拟所有‘vfork()’ 的语义(semantics, 译文取自《高级编程》,指定义的内容和做法)。

结论是,试图使用任何‘fork()’和‘vfork()’的不同点是*很*不明智的。事实上,可能使用‘vfork()’根本就是不明智的,除非你确切知道你想*干什么*。

两者的基本区别在于当使用‘vfork()’创建新进程时,父进程将被暂时阻塞,而子进程则可以借用父进程的地址空间。这个奇特状态将持续直到子进程要么退出,要么调用‘execve()’,至此父进程才继续执行。

这意味着一个由‘vfork()’创建的子进程必须小心以免出乎意料地改变父进程的变量。特别的,子进程必须不从包含‘vfork()’调用的函数返回,而且必须不调用‘exit()’(如果它需要退出,它需要使用‘_exit()’;事实上,对于使用正常 ‘fork()’创建的子进程这也是正确的)
回复 支持 反对

使用道具 举报

发表于 2006-4-30 17:13:47 | 显示全部楼层
为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?

‘exit()’与‘_exit()’有不少区别在使用‘fork()’,特别是‘vfork()’时变得很突出。

‘exit()’与‘_exit()’的基本区别在于前一个调用实施与调用库里用户状态结构 (user-mode constructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序 (译者注:自定义清除程序由atexit函数定义,可定义多次,并以倒序执行),相对应,后一个函数只为进程实施内核清除工作。

在由‘fork()’创建的子进程分支里,正常情况下使用‘exit()’是不正确的,这是因为使用它会导致标准输入输出(译者注:stdio: Standard Input Output)的缓冲区被清空两次,而且临时文件被出乎意料的删除(译者注:临时文件由tmpfile函数创建在系统临时目录下,文件名由系统随机生成)。在C++程序中情况会更糟,因为静态目标(static objects)的析构函数(destructors)可以被错误地执行。(还有一些特殊情况,比如守护程序,它们的*父进程*需要调用‘_exit()’而不是子进程;适用于绝大多数情况的基本规则是,‘exit()’在每一次进入‘main’函数后只调用一次。)

在由‘vfork()’创建的子进程分支里,‘exit()’的使用将更加危险,因为它将影响 *父*进程的状态。
回复 支持 反对

使用道具 举报

发表于 2006-4-30 21:32:49 | 显示全部楼层
Post by muxingren
我在看《unix环境高级编程》第146页,也就是第八章进程控制,书上说当vfork的子进程调用exit的时候,回把父进程所有打开的描述符都关闭,可是我在我的debian上实验的时候,发现并不是这样啊。
高手帮忙啊!谢谢!


看看系统的手册吧, 关于 vfork 和 exit 的.

这两个的组合其行为属于未定义.

另外, APUE2 里面也提到了这个问题.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-3 22:00:09 | 显示全部楼层
谢谢!各位,辛苦了!

不过还是不明白。
回复 支持 反对

使用道具 举报

发表于 2006-5-3 22:56:15 | 显示全部楼层
看LKD里有一段描述
其实现在vfork已经差不多鸡肋了
不是特别有作用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表