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


相关文章


STB上Linux软件系统解决方案Linux认证考试
FreeBSD系统root密码解决方法Linux认证考试
.htaccess使用方法总结Linux认证考试
内核中的likely和unlikely宏定义Linux认证考试
内核fork.c函数中的部分代码分析Linux认证考试
如何清除IE7的插件?Linux认证考试
内核直接读取硬盘固定扇区的代码Linux认证考试
Linux操作系统的内核解读入门Linux认证考试
对Linux内核进行压力测试Linux认证考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛