task_struct,struct pid,以及与其有关的API-Linux(7)
前言
写一写涉及到的Linux函数源码,拙见如有错误之处,还烦请各位指正。本博文的目录均是相对于/usr/src/linux-4.16.3 (Linux-4.16.3是手动下载的)而言
源码位置
要查看源码,首先要明白Linux的内核源码的存放的大概位置。先看一下目录: 目录分析:
-
arch/ 存放一些有关硬件的文件代码,本博文没有用到 include/ 大多数的头文件,一些结构体,服务例程的声明(添加系统调用在include/linux/syscalls.h 中声明) init/ 核心启动代码 mm 内存管理的代码 drivers 驱动器的代码 ipc 进程间的通讯代码 modules 可以加载的模块代码 fs 文件系统代码 kernel 核心代码,一些内核函数在这边 net 有关网络的代码 lib 核心的库 scripts 配置代码 documentation 说明文档
struck pid * find_get_pid(pid_t nr)
struct pid 是进程描述符,在include/linux/pid.h 中,其定义如下:
struct pid { atomic_t count; unsigned int level; /* lists of tasks that use this pid */ struct hlist_head tasks[PIDTYPE_MAX]; struct rcu_head rcu; struct upid numbers[1]; };
find_get_pid(pid_t nr) 是通过进程号pid_t nr得到进程描述符,并将结构体中的count加1,在linux/kernel/pid.c 中,源码如下:
struct pid *find_get_pid(pid_t nr) { struct pid *pid; rcu_read_lock(); pid = get_pid(find_vpid(nr)); rcu_read_unlock(); return pid; }
其中,find_vpid(pid_t nr) 返回的是进程描述符,get_pid(struct pid * kpid)则是让count加1. get_pid(pid* pid) 在/include/linux/pid.h 中
static inline struct pid *get_pid(struct pid *pid) { if (pid) atomic_inc(&pid->count); return pid; }
find_vpid(pid_t nr) 在/kernel/pid.c 中
struct pid *find_vpid(int nr) { return find_pid_ns(nr, task_active_pid_ns(current)); }
其中涉及到了find_pid_ns(nr,task_active_pid_ns(current)),哦,天! find_pid_ns(nr,task_active_pid_ns(current))
struct pid *find_pid_ns(int nr, struct pid_namespace *ns) { return idr_find(&ns->idr, nr); }
task_active_pid_ns(current) 是返回pid_namespace struct
struct pid_namespace *task_active_pid_ns(struct task_struct *tsk) { return ns_of_pid(task_pid(tsk)); }
pid_task(pid* pid,PIDTYPE_PID) 可以通过进程描述符找到task_struct* task pid_task(pid* pid,PIDTYPE_PID)
struct task_struct *pid_task(struct pid *pid, enum pid_type type) { struct task_struct *result = NULL; if (pid) { struct hlist_node *first; first = rcu_dereference_check(hlist_first_rcu(&pid->tasks[type]), lockdep_tasklist_lock_is_held()); if (first) result = hlist_entry(first, struct task_struct, pids[(type)].node); } return result; }
enum pid_type 在/include/linux/pid.h中,定义如下:
enum pid_type { PIDTYPE_PID, PIDTYPE_PGID, PIDTYPE_SID, PIDTYPE_MAX, /* only valid to __task_pid_nr_ns() */ __PIDTYPE_TGID };
task_struct 在/include/linux/sched.h 很多内容,可以查看一番,主要是:
-
进程状态:volatile long state;//取值0或1 进程标识符: pid_t pid; //进程标识符 pid_t tgid; //线程组标识符 进程标记符:unsigned int flags; 进程调度有关: int prio, //保存动态优先级 static_prio, //保存静态优先级 normal_prio;//值取决于静态优先级和调度策略 unsigned int rt_priority;//实时优先级,0~99
下一篇:
如何将node.js部署到服务器上