进程管理API之get_pid/ put_pid

本文介绍了Linux内核中PID管理机制的实现原理,包括获取和释放进程ID的过程。具体讲解了get_pid()函数如何增加PID引用计数并返回PID,以及put_pid()函数如何判断PID是否可以被释放并进行相应操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

inline struct pid *get_pid(struct pid *pid) 用于将struct pid结构体中的count字段加1 后,返回struct pid
其使用的例子如下:
static inline void ocfs2_add_holder(struct ocfs2_lock_res *lockres,
				   struct ocfs2_lock_holder *oh)
{
	INIT_LIST_HEAD(&oh->oh_list);
	oh->oh_owner_pid = get_pid(task_pid(current));
}
其源码分析如下:
static inline struct pid *get_pid(struct pid *pid)
{
	if (pid)
		atomic_inc(&pid->count);
	return pid;
}
可见如果pid 不为null,就增加pid->count后,返回pid
与get_pid对应的是put_pid
void put_pid(struct pid *pid)
{
	struct pid_namespace *ns;

	if (!pid)
		return;

	ns = pid->numbers[pid->level].ns;
	if ((atomic_read(&pid->count) == 1) ||
	     atomic_dec_and_test(&pid->count)) {
		kmem_cache_free(ns->pid_cachep, pid);
		put_pid_ns(ns);
	}
}
与get_pid 相比,除了判断pid不能为null,还会判断当前的pid->count是否等于1,如果等于1的话,再减去1的话,就是0.
说明后面没有人用这个pid了,因此要把ns中对pid的缓存去掉,并通过put_pid_ns将ns的ns->kref 一次减1
void put_pid_ns(struct pid_namespace *ns)
{
	struct pid_namespace *parent;

	while (ns != &init_pid_ns) {
		parent = ns->parent;
		if (!kref_put(&ns->kref, free_pid_ns))
			break;
		ns = parent;
	}
}
可见如果当前ns的kref->refcount 等于0,就调用free_pid_ns释放当前的ns
static inline int kref_put(struct kref *kref, void (*release)(struct kref *kref))
{
	if (refcount_dec_and_test(&kref->refcount)) {
		release(kref);
		return 1;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值