Linux内核API task_tgid_nr_ns

task_tgid_nr_ns函数功能描述:此函数用于获取满足一定条件的进程的PID,函数执行如下:首先调用函数task_tgid( )获得参数tsk包含进程组中的领头进程的进程描述符,然后调用函数pid_nr_ns( )获得进程的进程号,必须保证此进程的进程命名空间值和参数ns相同。

task_tgid_nr_ns文件包含

#include <linux/sched.h>

task_tgid_nr_ns函数定义

在内核源码中的位置:linux-3.19.3/kernel/pid.c

函数定义格式:

pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns)

task_tgid_nr_ns输入参数说明

  • 参数 tsk 是struct task_struct结构体类型的指针变量,保存任务描述符信息,其定义参见内核源码文件linux-3.19.3/include/linux/sched.h,内核注释比较详细,请读者自行分析。
  • 参数ns是struct pid_namespace结构体类型的指针变量,保存进程的命名空间信息,其定义及详细解释请参考__task_pid_nr_ns()

task_tgid_nr_ns返回参数说明

此函数的返回值是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

task_tgid_nr_ns实例解析

编写测试文件:task_tgid_nr_ns.c

头文件引用:

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/pid.h>
MODULE_LICENSE("GPL");

模块加载函数定义:

static int __init task_tgid_nr_ns_init(void)
{
    printk("into task_tgid_nr_ns_init.\n");
    struct pid * kpid=find_get_pid(current->pid);      //获取当前进程的进程描述符信息

    // 获取进程所在任务的任务描述符信息
    struct task_struct * task=pid_task(kpid, PIDTYPE_PID);
    pid_t result1=task_tgid_nr_ns(task, kpid->numbers[kpid->level].ns); //获取进程号

    // 显示进程的进程号
    printk("the pid of the find_get_pid is :%d\n", kpid->numbers[kpid->level].nr);

    //显示函数task_tgid_nr_ns( )的返回值
    printk("the result of the task_tgid_nr_ns is:%d\n", result1);

    printk("the pid of current thread is :%d\n", current->pid); //显示当前进程的进程号
    printk("out task_tgid_nr_ns_init.\n");
    return 0;
}

模块退出函数定义:

static void __exit task_tgid_nr_ns_exit(void)
{
    printk("Goodbye task_tgid_nr_ns\n");
}

模块加载、退出函数调用:

module_init(task_tgid_nr_ns_init);
module_exit(task_tgid_nr_ns_exit);

实例运行结果及分析:

首先编译模块,执行命令insmod task_tgid_nr_ns.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。

Linux内核API task_tgid_nr_ns

结果分析:

由上图可以看出函数task_tgid_nr_ns( )的返回结果是17716,此值正好和当前进程的进程号相同,说明函数能够获得满足输入参数要求的进程的PID的值。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程