Linux进程管理内核API函数pid_task( )

简介: pid_task( ) 函数获取任务的任务描述符信息,此任务在进程pid的使用链表中,并且搜索的链表的起始元素的下标为参数type的值。

pid_task( ) 函数获取任务的任务描述符信息,此任务在进程pid的使用链表中,并且搜索的链表的起始元素的下标为参数type的值。    参数pid是struct pid 类型的指针变量,保存进程描述符信息,其定义及详细解释请读者自行参考本章函数find_get_pid( )分析文档的返回参数说明部分。

参数type是pid_type型变量,此变量是一个枚举型变量,定义如下:

enum pid_type

{

       PIDTYPE_PID,    //进程的进程号

       PIDTYPE_PGID,   //进程组领头进程的进程号

       PIDTYPE_SID,    //会话领头进程的进程号

       PIDTYPE_MAX 

}; 

返回参数说明:

    此函数的返回结果是struct task_struct结构体类型的变量,保存对应的任务描述符的信息,其定义参见内核源码文件linux-2.6.30/include/linux/sched.h,内核源码注释比较详细,请读者自行分析。 

实例解析:

#include <linux/module.h>

#include <linux/sched.h>

#include <linux/pid.h>

MODULE_LICENSE("GPL");

//子进程函数定义

int my_function(void * argc)

{

       printk("<0>in the kernel thread function!\n");     

       return 0;

}

//模块初始化函数函数定义

static int __init pid_task_init(void)

{     

       int result;

       printk("<0> into pid_task_init.\n");             

       result=kernel_thread(my_function,NULL,CLONE_KERNEL);      //创建新进程

       struct pid * kpid=find_get_pid(result);                   //获取新进程的描述符信息

    struct task_struct * task=pid_task(kpid,PIDTYPE_PID);    //获取进程的任务描述符信息

    printk("<0>the state of the task is:%d\n",task->state);      //显示任务当前所处的状态

       printk("<0>the pid of the task is:%d\n",task->pid);        //显示任务的进程号

       printk("<0>the tgid of the task is:%d\n",task->tgid);      //显示任务的线程组号

 

    //显示函数kernel_thread( )函数执行结果

       printk("<0>the kernel_thread result is:%d\n",result);

       printk("<0> out pid_task_init.\n");

       return 0;

}

 

//模块卸载函数定义

static void __exit pid_task_exit(void)

{

    printk("<0>Goodbye  pid_task\n");

}

module_init(pid_task_init);

module_exit(pid_task_exit);

首先编译模块,执行命令insmod pid_task.ko插入模块,然后执行命令dmesg –c查看内核输出信息,会出现如图所示的结果:


可以得出任务处在runnable状态,因为state的值为0。state可能的取值为-1、0、大于0,等于-1处于不可运行状态,等于0处于可运行状态,大于0处于停止运行状态。任务的进程号和线程组号相同,并且等于新创建的进程的进程号,对于一个任务其包含的进程的进程号一般和其线程组号相同。

本文出自:《Linux内核API完全参考手册》邱铁,周玉,邓莹莹 编著,机械工业出版社 2011年1月1日出版
目录
相关文章
|
1天前
|
算法 Linux C++
【探索Linux】P.31(守护进程)
【探索Linux】P.31(守护进程)
15 7
|
1天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
7 0
|
1天前
|
存储 缓存 安全
Linux系统内核面试题
Linux系统内核面试题
11 3
|
1天前
|
存储 安全 Linux
【探索Linux】P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )
【探索Linux】P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )
4 0
|
1天前
|
存储 算法 Linux
【探索Linux】P.17(进程信号 —— 信号保存 | 阻塞信号 | sigprocmask() | sigpending() )
【探索Linux】P.17(进程信号 —— 信号保存 | 阻塞信号 | sigprocmask() | sigpending() )
4 0
|
1天前
|
算法 Linux C++
【探索Linux】P.16(进程信号 —— 信号产生 | 信号发送 | 核心转储)
【探索Linux】P.16(进程信号 —— 信号产生 | 信号发送 | 核心转储)
3 0
|
1天前
|
消息中间件 存储 Unix
【探索Linux】P.15(进程间通信 —— system V共享内存)
【探索Linux】P.15(进程间通信 —— system V共享内存)
10 0
|
1天前
|
消息中间件 Unix Linux
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
8 0
|
2天前
|
Linux Shell
Linux中system函数
Linux中system函数
7 0
|
2天前
|
缓存 运维 算法
深入理解Linux内核的虚拟内存管理
【5月更文挑战第6天】 在现代操作系统中,尤其是类Unix系统如Linux中,虚拟内存管理是一项核心功能,它不仅支持了多任务环境,还提供了内存保护和抽象。本文将深入探讨Linux操作系统的虚拟内存子系统,包括分页机制、虚拟地址空间布局、页面置换算法以及内存分配策略。通过对这些概念的剖析,我们旨在为读者揭示Linux如何有效地管理和优化物理内存资源,并确保系统的稳定运行与高效性能。