task_struct,struct pid,以及与其有关的API-Linux(7)

前言

写一写涉及到的Linux函数源码,拙见如有错误之处,还烦请各位指正。本博文的目录均是相对于/usr/src/linux-4.16.3 (Linux-4.16.3是手动下载的)而言

源码位置

要查看源码,首先要明白Linux的内核源码的存放的大概位置。先看一下目录:
task_struct,struct pid,以及与其有关的API-Linux(7)_第1张图片
目录分析:

  • 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

你可能感兴趣的:(Linux,云服务器)