2014-10-19 77 views
0

我想使用模塊打印進程ID,進程名稱和進程狀態,作爲測試我嘗試使用getpid()函數打印進程ID,但出現以下錯誤發生:如何使用模塊獲取進程ID,名稱和狀態

的功能「printf」式的功能

隱式聲明隱式聲明「GETPID」

如何解決這些錯誤,以及如何打印進程名和狀態。

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 

/* This function is called when the module is loaded. */ 
int simple_init(void) 
{ 
     printk(KERN_INFO "Loading Module\n"); 
     printf("The process id is %\n", (int) getpid()); 
     return 0; 
} 

/* This function is called when the module is removed. */ 
void simple_exit(void) { 
    printk(KERN_INFO "Removing Module\n"); 
} 

/* Macros for registering module entry and exit points. */ 
module_init(simple_init); 
module_exit(simple_exit); 

MODULE_LICENSE("GPL"); 
MODULE_DESCRIPTION("Simple Module"); 
MODULE_AUTHOR("SGG"); 
+1

如果您對Linux應用程序級編程不夠熟悉,爲什麼需要編寫內核模塊? – 2014-10-19 15:10:51

回答

2

你的問題沒有意義。 getpid(以及其他所有syscalls(2) ...)只能在用戶應用程序代碼中運行,而不能在內核中運行。即使沒有任何特定的過程,內核也可能運行一些模塊代碼。特別是,當模塊被加載時,模塊初始化發生得很早。

我推薦在編碼模塊之前閱讀Advanced Linux ProgrammingLinux kernel wikipage和kernelnewbies。壞的內核模塊可能會丟失所有的數據或者(如果不幸)破壞你的硬件。

您可能想要從內核的調度程序中查詢當前任務。請參閱this,但在理解更多內容之前不要編寫任何與內核相關的代碼。

1

要以非常基本的方式回答您的問題:某些內核的功能(包括init()exit())「代表」用戶空間進程執行。也就是說,當您使用insmod插入模塊時,將執行init()函數,並且在使用rmmod刪除模塊時,會執行exit()函數。因此,我們可以說init()函數正在代表insmod進程執行。 exit()rmmod的情況也是如此。

現在,問題是找到該特定函數的相對過程。這可以簡單地通過使用宏觀current來實現。宏是struct task_struct。需要注意的是,在Linux內部,每個進程的任務控制塊(或PCB)由struct task_struct表示。這個數據結構包含了與進程相對應的所有信息,比如狀態,名稱,MM信息等。我建議您一次查看數據結構。 http://lxr.free-electrons.com/source/include/linux/sched.h#L1223

當一個特定的功能代表過程的執行(比如init()),內核關聯的current宏與進程的task_struct。因此,通過簡單地訪問struct task_struct的各個字段,我們可以獲得與該函數相關的過程的信息。

所以,你的情況,也可能是這樣的:

current->comm:給人的過程

current->pid名稱:給人的過程

希望這有助於的PID。

1
#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/sched.h> //task_pid_nr 

/* This function is called when the module is loaded. */ 
int simple_init(void) 
{ 
     printk(KERN_INFO "Loading Module\n"); 
     printk("The process id is %d\n", (int) task_pid_nr(current)); 
     printk("The process vid is %d\n", (int) task_pid_vnr(current)); 
     printk("The process name is %s\n", current->comm); 
     printk("The process tty is %d\n", current->signal->tty); 
     printk("The process group is %d\n", (int) task_tgid_nr(current)); 
     printk("\n\n"); 
    //return -1; //debug mode of working 
    return 0; 
} 

/* This function is called when the module is removed. */ 
void simple_exit(void) { 
    printk(KERN_INFO "Removing Module\n"); 
} 

/* Macros for registering module entry and exit points. */ 
module_init(simple_init); 
module_exit(simple_exit); 

MODULE_LICENSE("GPL"); 
MODULE_DESCRIPTION("Simple Module"); 
MODULE_AUTHOR("SGG");