ind_get_pid
find_get_pid(...)函数功能:根据进程编号获取对应的进程描述符,具体Linux内核源码对应函数设计如下:
获取进程描述符,且描述符的count+1,表示进程多一个用户
pid_task
pid_task(...)函数功能:获取任务的任务描述符数据信息,具体Linux内核源码对应函数设计如下:
pid_nr
pid_nr(...)函数功能:获取进程的全局进程号,具体Linux内核源码对应的函数设计如下:
__task_pid_nr_ns
__task_pid_nr_ns(...)函数功能:获取进程编号,具体Linux内核源码对应函数设计如下:
实验代码
#include <linux/sched.h> #include <linux/pid.h> #include <linux/module.h> static int __init pidtest_initfunc(void) { printk("调用 pidtest_initfunc(...)函数.\n"); // 1 : find_get_pid(...) struct pid *kernelpid=find_get_pid(current->pid); printk("打印进程描述符 count 的值: %d\n",kernelpid->count); printk("打印进程描述符 level 的值: %d\n",kernelpid->level); printk("打印进程描述符 nnumbers 的值:%d\n",kernelpid->numbers[kernelpid->level].nr); // 2 : pid_nr(..) int iNr=pid_nr(kernelpid); printk("打印进程描述符的全局进程编号为:%d\n",iNr); printk("打印进程描述符的当前线程组编号为:%d\n",current->tgid); // 3 : pid_task(...) struct task_struct *ttask=pid_task(kernelpid,PIDTYPE_PID); printk("打印任务当前的状态为: %ld\n",ttask->stats); printk("打印任务当前的进程号为:%d\n",ttask->pid); // 4 : __task_pid_nr_ns(...) pid_t rest=__task_pid_nr_ns(ttask,PIDTYPE_PID,kernelpid->numbers[kernelpid->level].ns); printk("调用__task_pid_nr_ns(...)函数,输出结果为:%d\n",rest); printk("退出 pidtest_initfunc(...)函数.\n"); return 0; } static void __exit pidtest_exitfunc(void) { printk("正常退出 Linux 内核......\n"); } MODULE_LICENSE("GPL"); module_init(pidtest_initfunc); module_exit(pidtest_exitfunc);
obj-m:=pidtest.o CURRENT_PAHT:=$(shell pwd) LINUX_KERNEL:=$(shell uname -r) LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL) all: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) modules clean: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PAHT) cleals
make sudo insmod pidtest.ko dmesg -c