find_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