Chinaunix首页 | 论坛 | 博客
  • 博客访问: 916860
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-07-30 17:01:32

     前面介绍了pid到struct pid的内核函数,接下来的就是struct pid
到task_struct。task_struct就是很熟悉的东西了。描述一个进程的结构
体,又称进程描述符。
-------------------------------------------------------------------------------------
1,实现由struct pid到task_struct的主要函数就是pid_task().
  1. 399 struct task_struct *pid_task(struct pid *pid, enum pid_type type)
  2. 400 {
  3. 401 struct task_struct *result = NULL;
  4. 402 if (pid) {
  5. 403 struct hlist_node *first;
  6. 404 first = rcu_dereference_check(pid->tasks[type].first,
  7. 405 rcu_read_lock_held() ||
  8. 406 lockdep_tasklist_lock_is_held());
  9. 407 if (first)
  10. 408 result = hlist_entry(first, struct task_struct, pids[(type)].node);
  11. 409 }
  12. 410 return result;
  13. 411 }
由于一个struct pid对应多个进程,所以找到了struct pid还需要找到
对应的进程。
----------------------------------------------------------------------------------------------
2,内核中还有很多函数对其进行了封装,直接由进程的pid就可以找到task_struct。主要有两个内核函数,一个是find_task_by_vpid,另外
一个是find_task_by_pid_ns
  1. 422 struct task_struct *find_task_by_vpid(pid_t vnr)
  2. 423 {
  3. 424 return find_task_by_pid_ns(vnr, current->nsproxy->pid_ns);
  4. 425 }
  1. 417 struct task_struct *find_task_by_pid_ns(pid_t nr, struct pid_namespace *ns)
  2. 418 {
  3. 419 return pid_task(find_pid_ns(nr, ns), PIDTYPE_PID);
  4. 420 }
这两个函数实现的是一样的,主要就是调用了前面分析的两个函数,
find_pid_ns和pid_task
----------------------------------------------------------------------------------------------
3,其调用关系图如下:
----------------------------------------------------------------------------------------------

阅读(11770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~