#include<linux/pid.h> #include<linux/sched.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("viz.xu, xujiweigo@163.com"); static int __task_pid_nr_ns_init(void); static void __task_pid_nr_ns_exit(void); static int __init __task_pid_nr_ns_init(void) { printk("task_pid_nr_ns ...
其中在容器中查看进程 pid 使用的是 pid_vnr,pid_vnr 调用 pid_nr_ns 来查看进程在特定命名空间里的进程号。 函数pid_nr_ns 接收连个参数 第一个参数是进程里记录的 pid 对象(保存有在各个层次申请到的 pid 号) 第二个参数是指定的 pid 命名空间(通过 task_active_pid_ns(current)获取)。 当具备这两个...
return pid_nr_ns(pid, task_active_pid_ns(current)); } 其中在容器中查看进程 pid 使用的是 pid_vnr,pid_vnr 调用 pid_nr_ns 来查看进程在特定命名空间里的进程号。 函数pid_nr_ns 接收连个参数 第一个参数是进程里记录的 pid 对象(保存有在各个层次申请到的 pid 号) 第二个参数是指定的 pid 命名...
nr); // 显示命名空间字段last_pid的值 printk("the last_pid of the task_active_pid_ns result is:%d\n", ns->last_pid); printk("the pid of current thread is :%d\n", current->pid); //显示当前进程的PID printk("out task_active_pid_ns_init.\n"); return 0; } C Copy...
//file:kernel/fork.cstaticstruct task_struct*copy_process(...){...//2.1 拷贝进程的命名空间 nsproxyretval=copy_namespaces(clone_flags,p);//2.2 申请 pidpid=alloc_pid(p->nsproxy->pid_ns);//2.3 记录 pidp->pid=pid_nr(pid);p->tgid=p->pid;attach_pid(p,PIDTYPE_PID,pid);...} ...
上一篇文章讲解了__task_pid_nr_ns和find_get_pid函数,前者根据所提供的进程号找到对应的进程描述符,并使该进程描述符字段count加1,即用户使用数加1,后者则相反,用于获取进程的进程号。今天来讲解另外两个函数get_pid和get_task_mm,这两个函数也是进程管理相关的函数,前者用于改变进程描述符的count字段的值,使...
nr:进程号 ns:命名空间 返回值:进程描述符指针 头文件:#incldue <linux/pid.h> (2)static inline structpid*get_pid(structpid*pid) 功能:将进程描述符pid的引用计数加1pid:进程描述符指针 返回值:返回进程描述符指针 头文件:#include <linux/pid.h> 内核 ...
从最顶层开始,一层层往下剖析,我们的目的要获得当前进程的pid,所以我们首先需要获得我们当前的一个task结构体,通过linux中设置的current宏,我们很轻易的可以获取当前进程的task_struct,为了获取指定pid namespace空间的pid,我们还需要获取指定的pid_namespace *ns,然后通过内核函数pid_nr_ns()获取到指定ns的pid即可。
[root@haha demo]# ./pidns_init_sleep /proc30PID returnedbyclone(): 25070childFunc(): PID=1childFunc(): PPID =0Mounting procfs at /proc30 前两行输出显示了从两个不同PID命名空间的角度来看子进程的PID:调用clone()的“调用者的命名空间”和“子进程所在的命名空间”。
nr = alloc_pidmap(tmp); //分配pid【见小节2.3】 ... pid->numbers[i].nr = nr; //nr保存到pid结构体 pid->numbers[i].ns = tmp; tmp = tmp->parent; } ... get_pid_ns(ns); atomic_set(&pid->count, 1); for (type = 0; type < PIDTYPE_MAX; ++type) ...