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