Linux进程管理内核API函数pid_task( )
2013-09-11 13:10
1641 查看
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查看内核输出信息,会出现如图所示的结果:
![](http://hiphotos.baidu.com/armlinuxqt/pic/item/fbbabc32bd3a56cf5fdf0e00.jpg)
可以得出任务处在runnable状态,因为state的值为0。state可能的取值为-1、0、大于0,等于-1处于不可运行状态,等于0处于可运行状态,大于0处于停止运行状态。任务的进程号和线程组号相同,并且等于新创建的进程的进程号,对于一个任务其包含的进程的进程号一般和其线程组号相同。
[b]本文出自:《Linux内核API完全参考手册》邱铁,周玉,邓莹莹 编著,机械工业出版社 2011年1月1日出版[/b]
参数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查看内核输出信息,会出现如图所示的结果:
![](http://hiphotos.baidu.com/armlinuxqt/pic/item/fbbabc32bd3a56cf5fdf0e00.jpg)
可以得出任务处在runnable状态,因为state的值为0。state可能的取值为-1、0、大于0,等于-1处于不可运行状态,等于0处于可运行状态,大于0处于停止运行状态。任务的进程号和线程组号相同,并且等于新创建的进程的进程号,对于一个任务其包含的进程的进程号一般和其线程组号相同。
[b]本文出自:《Linux内核API完全参考手册》邱铁,周玉,邓莹莹 编著,机械工业出版社 2011年1月1日出版[/b]
相关文章推荐
- 一个Linux内核利用init_task进行进程管理的简单例子
- 一个Linux内核利用init_task进行进程管理的简单例子
- Linux内核——进程管理与调度
- Linux下的进程管理——task_struct
- Linux进程管理之task_struct结构体(下)
- Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】
- linux 内核介绍2 进程管理
- Linux进程管理---task_struct结构体
- Linux进程管理之task_struct结构
- Linux进程管理下的PCB(task_struct)
- Linux进程管理之task struct结构体
- Linux进程管理之task_struct
- Linux进程管理---task_struct
- 内核管理-之进程虚拟内存-基于linux3.10
- Linux进程管理之task_struct
- Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)
- linux进程管理之task_struct结构体
- 读薄「Linux 内核设计与实现」(2) - 进程管理和调度
- Linux内核设计与实现-进程管理与进程调度
- Linux进程管理之task_struct结构体