天天看點

Linux程序管理核心API函數pid_task( )

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");

//子產品解除安裝函數定義

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檢視核心輸出資訊,會出現如圖所示的結果:

Linux程式管理核心API函數pid_task( )

可以得出任務處在runnable狀态,因為state的值為0。state可能的取值為-1、0、大于0,等于-1處于不可運作狀态,等于0處于可運作狀态,大于0處于停止運作狀态。任務的程序号和線程組号相同,并且等于新建立的程序的程序号,對于一個任務其包含的程序的程序号一般和其線程組号相同。

本文出自:《Linux核心API完全參考手冊》邱鐵,周玉,鄧瑩瑩 編著,機械工業出版社 2011年1月1日出版

繼續閱讀