在vfork系统调用中,父进程和子进程共享页面,子进程发生的任何全局变量变化(比如说)都会反映到父进程中,一旦它返回。现在,如果我们从子进程执行exec()系统调用,它会将指定的程序加载到子进程的地址空间中,当父进程再次变为活动状态时,是否会发现已损坏的数据和堆栈框架(通过子进程加载新的二进制文件)? 请回复,Vfork系统调用
0
A
回答
0
不,内核安排这不成问题。我不记得具体细节了,但一般程序是:当进程调用vfork
时,内核保存堆栈指针和PC,并为子进程执行部分设置。当名为vfork
的进程调用execve
时,内核将为新的程序映像创建一个新的地址空间,而不是覆盖调用进程的地址空间。然后它将父母的堆栈指针和PC恢复到原来的状态,父母从vfork
处继续。
为vfork
在线联机手册是令人失望的模糊,而且往往有关于它的效用的危险,缺乏,这是不公平的尖刻评论 - 这真的是比fork
更有效,即使写入时复制地址空间的共享,因为它不需要刷新TLB或在内核中执行几乎一样的工作,并且它的语义在各种仍然广泛使用的操作系统中相当一致。错误处理是屁股疼痛,但如果你认真对待,错误处理与简单的fork
一样糟糕。
[有谁知道在vfork
和execve
之间做I/O重定向安装是否安全?该标准不保证它,并且manpages也没有,但是我的回忆是在该窗口中的打开/关闭/ dup操作仅影响待定孩子,如同fork
。]
相关问题
- 1. 系统(“”)调用
- 2. sigaction系统调用
- 3. Pipe()系统调用
- 4. python系统调用
- 5. fork系统调用
- 6. sys_execve系统调用
- 7. MIPS:系统调用
- 8. Ptracing系统调用
- 9. 调用C“系统” ++
- 10. 系统调用write
- 11. indir系统调用
- 12. 管系统调用
- 13. FreeBSD从另一个系统调用发出系统调用
- 14. 双叉使用vfork
- 15. 使用read()系统调用
- 16. 系统()调用用C
- 17. 使用系统调用
- 18. UNIX系统调用列表?
- 19. 系统调用示例
- 20. 系统问题()调用
- 21. Linux系统调用getifaddr C++
- 22. 与c的系统调用
- 23. 坐骑系统调用
- 24. 系统调用在C++中
- 25. NtAllocateVirtualMemory系统调用参数
- 26. 开放系统调用 - Linux
- 27. 调用预先-NT系统
- 28. 中断系统调用
- 29. linux系统调用getpeername C++
- 30. windbg日志系统调用
+1第一段;我抵制了第二段做-1的诱惑。 – 2011-03-29 04:01:40