您的位置:首页 > 其它

进程管理API之get_pid_task

2017-12-06 08:34 4407 查看
struct task_struct *get_pid_task(struct pid *pid, enum pid_type type)
这个函数用于通过全局pid和其类型找到对应的task结构,并增加这个task的usage,因此使用
这个函数后,必须要调用put_task_struct来将task的usage减一。
其中pid的类型定义如下:
enum pid_type
{
PIDTYPE_PID,
PIDTYPE_PGID,
PIDTYPE_SID,
PIDTYPE_MAX
};

其使用的例程如下:
static int proc_single_show(struct seq_file *m, void *v)
{
struct inode *inode = m->private;
struct pid_namespace *ns;
struct pid *pid;
struct task_struct *task;
int ret;

ns = inode->i_sb->s_fs_info;
pid = proc_pid(inode);
task = get_pid_task(pid, PIDTYPE_PID);
if (!task)
return -ESRCH;

ret = PROC_I(inode)->op.proc_show(m, ns, pid, task);

put_task_struct(task);
return ret;
}
其源码分析如下:
struct task_struct *get_pid_task(struct pid *pid, enum pid_type type)
{
struct task_struct *result;
#访问task所在hlist时候,必须用rcu_read_lock/rcu_read_unlock 保护起来
rcu_read_lock();
#首先根据全局pid和type找到task。这个函数前面的博文已经分析过
result = pid_task(pid, type);
if (result)
#reslut 不为null,则表示找到pid和type 对应的task,调用get_task_struct 让task的usage加1
get_task_struct(result);
rcu_read_unlock();
return result;
}
get_task_struct 原来是一个宏
#define get_task_struct(tsk) do { atomic_inc(&(tsk)->usage); } while(0)
总结一下,调用get_pid_task 后,需要调用put_task_struct
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: