内核fork.c函数中的部分代码分析Linux认证考试
文章作者 100test 发表时间 2009:12:24 16:21:15
来源 100Test.Com百考试题网
在内核代码 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.
}
第4行判断clone_flags中是否有CLONE_VFORK标志。如果有则执行下面的的代码:
p->.vfork_done = &.vfork.
init_completion(&.vfork).
在task_struct结构体中vfork_done是这样定义的:
struct completion * vfork_done.
函数init_completion()定义如下:
static inline void init_completion(struct completion *x)
{
x->.done = 0.
init_waitqueue_head(&.x->.wait).
}
这个函数的作用是在进程创建的最后阶段,父进程会将自己设置为不可中断状态,然后睡眠在
等待队列上(init_waitqueue_head()函数 就是将父进程加入到子进程的等待队列),等待子进程的唤醒。