在vfork系统调用中,父进程和子进程共享页面,子进程对全局变量(比方说)的任何更改都会在父进程返回时反映给父进程。现在,如果我们从子进程执行exec()系统调用,它会将指定的程序加载到子进程的地址空间中,当父进程再次变为活动状态时,它不会发现损坏的数据和堆栈帧(具有由子进程加载的新二进制文件)吗?请回复,
发布于 2011-02-23 02:27:23
不,内核安排这不是一个问题。我不记得确切的细节了,但一般的过程是:当一个进程调用vfork时,内核保存堆栈指针和PC,并为子进程执行部分设置。当调用了vfork的进程调用execve时,内核会为新程序映像创建一个新的地址空间,而不是覆盖调用进程的地址空间。然后,它将父级的堆栈指针和PC恢复到它们以前的状态,并且父级从vfork的点继续。
vfork的联机手册页含糊得令人失望,并且倾向于对它的危险和缺乏实用性发表尖刻的评论,这是不公平的--它确实比fork更有效,即使在写时复制地址空间共享,因为它不需要刷新TLB或在内核中做几乎同样多的工作,并且它的语义在仍在广泛使用的OSes中相当一致。错误处理是一件很痛苦的事情,但是如果你是认真的,用普通的fork处理错误也同样糟糕。
有人知道在vfork和execve之间进行I/O重定向设置是否安全吗?标准不能保证这一点,手册页也不能保证这一点,但我记得那个窗口中的打开/关闭/dup操作只影响未来的子窗口,就像fork一样。
https://stackoverflow.com/questions/5081731
复制相似问题