上QQ阅读APP看书,第一时间看更新
3.9 函数:pid_nr( )
文件包含:
#include <linux/pid.h>
函数定义:
在内核源码中的位置:linux-3.19.3/include/linux/pid.h
函数定义格式:
static inline pid_t pid_nr(struct pid *pid) { pid_t nr = 0; if (pid) nr = pid->numbers[0].nr; return nr; }
函数功能描述:
函数pid_nr( )用于获取进程的全局进程号,根据输入参数所代表的进程描述符获取全局进程号。
输入参数说明:
此函数的输入参数是struct pid结构体类型的指针变量,保存进程描述符信息,其定义及详细解释请读者自行参考本章函数f ind_get_pid( )分析文档的返回参数说明部分。
返回参数说明:
此函数的返回值是pid_t类型的变量,在此代表获取的进程的全局进程号,pid_t的定义见文件linux-3.19.3/include/linux/types.h,如下:
typedef __kernel_pid_t pid_t。
其中__kernel_pid_t的定义见文件linux-3.19.3/include/uapi/asm-generic/posix_types.h,如下:
#ifndef __kernel_pid_t typedef int __kernel_pid_t; #endif
实例解析:
编写测试文件:pid_nr.c
头文件引用:
#include <linux/module.h> #include <linux/sched.h> #include <linux/pid.h> MODULE_LICENSE("GPL");
模块加载函数定义:
static int __init pid_nr_init(void) { printk("into pid_nr_init.\n"); struct pid * kpid=find_get_pid(current->pid); //获取当前进程的描述符 printk("the level of the pid is:%d\n", kpid->level); //显示进程描述符的level的值 printk("the pid of the pid is:%d\n", kpid->numbers[kpid->level].nr); //显示进程的进程号 int nr = pid_nr(kpid); //获取进程描述符的全局进程号 printk("the pid_nr result is:%d\n", nr); //显示全局进程号 printk("the current pid is:%d\n", current->pid); //显示当前进程的进程号 printk("the current tgid is:%d\n", current->tgid); //显示当前进程的线程组号 printk("out pid_nr_init.\n"); return 0; }
模块退出函数定义:
static void __exit pid_nr_exit(void) { printk("Goodbye pid_nr\n"); }
模块加载、退出函数调用:
module_init(pid_nr_init); module_exit(pid_nr_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod pid_nr.ko插入模块,然后执行命令dmesg -c查看内核输出信息,会出现如图3-9所示的结果。
图3-9 插入pid_nr模块系统输出信息
结果分析:
图3-9输出结果显示当前进程的进程号为15552,函数pid_nr( )获取的全局进程号也是15552,其实全局进程号就是一般意义上说的进程号,二者相同。