在内核代码 2.6.15.5中/kernel/fork.c第1255-1261中有如下代码:
1. p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, pid);
2. if (!IS_ERR(p)) {
3. struct completion vfork;
4 . if (clone_flags & CLONE_VFORK) {
5. p->vfork_done = &vfork;
6. init_completion(&vfork);
7. }
为了方便描述我在这段代码上加了行号。
第一行首先通过copy_process()函数完成具体的进程创建工作,返回值类型为task_t类型。
第2行用函数 IS_ERR()分析copy_process()的返回值是否正确。如果正确则执行第3-7行代码。
这里分析一下接下来这几行代码:
struct completion vfork; //定义struct completion 类型的变量 vfork;
关于struct completion的定义如下:
struct completion {
unsigned int done;
wait_queue_head_t wait;
1