进程管理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
相关文章推荐
- 进程管理API之get_task_pid
- 进程管理API之__task_pid_nr_ns
- 进程管理API之find_get_pid
- 进程管理API之pid_task
- 进程管理API之task_active_pid_ns
- 进程管理API之get_task_mm
- 进程管理API之get_pid/ put_pid
- 进程管理API之find_task_by_pid_ns
- 进程管理API之find_pid_ns
- Linux进程管理内核API函数pid_task( )
- uc笔记07---进程管理,PID,#ps,getxxxid,fork,vfork,system
- 进程管理API之task_tgid_nr_ns
- 进程管理API之find_ge_pid
- 进程管理API之pid_nr/pid_vnr/pid_nr_ns
- 进程管理API之ns_of_pid
- 进程管理API之find_task_by_vpid
- Atitit.进程管理常用api
- Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)
- cmd Tasklist与Tskill管理Windows系统进程
- 一个Linux内核利用init_task进行进程管理的简单例子