2011-02-22 100 views
0

在vfork系统调用中,父进程和子进程共享页面,子进程发生的任何全局变量变化(比如说)都会反映到父进程中,一旦它返回。现在,如果我们从子进程执行exec()系统调用,它会将指定的程序加载到子进程的地址空间中,当父进程再次变为活动状态时,是否会发现已损坏的数据和堆栈框架(通过子进程加载新的二进制文件)? 请回复,Vfork系统调用

回答

0

不,内核安排这不成问题。我不记得具体细节了,但一般程序是:当进程调用vfork时,内核保存堆栈指针和PC,并为子进程执行部分设置。当名为vfork的进程调用execve时,内核将为新的程序映像创建一个新的地址空间,而不是覆盖调用进程的地址空间。然后它将父母的堆栈指针和PC恢复到原来的状态,父母从vfork处继续。

vfork在线联机手册是令人失望的模糊,而且往往有关于它的效用的危险,缺乏,这是不公平的尖刻评论 - 这真的是比fork更有效,即使写入时复制地址空间的共享,因为它不需要刷新TLB或在内核中执行几乎一样的工作,并且它的语义在各种仍然广泛使用的操作系统中相当一致。错误处理是屁股疼痛,但如果你认真对待,错误处理与简单的fork一样糟糕。

[有谁知道在vforkexecve之间做I/O重定向安装是否安全?该标准不保证它,并且manpages也没有,但是我的回忆是在该窗口中的打开/关闭/ dup操作仅影响待定孩子,如同fork。]

+0

+1第一段;我抵制了第二段做-1的诱惑。 – 2011-03-29 04:01:40