进程管理API之get_pid_task

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值