内核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()函数 就是将父进程加入到子进程的等待队列),等待子进程的唤醒。