- 论坛徽章:
- 0
|
本帖最后由 vupiggy 于 2011-09-14 03:31 编辑
回复 3# ChiyuT
1. 内核提供了 vfork,你就要信任它,否则内核的所有接口你都可以怀疑,那程序还有法往下写吗?
2. 单从用户空间看 vfork 能否胜任你的需求的确有点可疑,这样吧,让代码说话:
- /* 内核 do_fork() 函数 */
- if (clone_flags & CLONE_VFORK) {
- p->vfork_done = &vfork;
- init_completion(&vfork);
- }
- ...
- if (clone_flags & CLONE_VFORK) {
- freezer_do_not_count();
- wait_for_completion(&vfork);
- freezer_count();
- tracehook_report_vfork_done(p, nr);
- }
复制代码 内核一定会让父进程睡觉,而且这个睡觉是 UNINTERRUPTIBLE,信号唤不醒地。父进程醒来只有两种可能,也就是内核里只有两个点调用 complete(&父进程的vfork_done),一个在
mm_release()(另一个地方在 coredump_wait(),就不考虑了吧)。 mm_release() 只有两个地方调用,一个是 do_execve() |-> exec_mmap()-|> mm_release,另外一个是 do_exit() |-> exit_mm() |-> mm_release,也就是说,内核当且仅当经过这两个点会让父进程从 vfork() 返回,这和你从 manpage 里看到的描述是一样的。放心使用吧。 |
|