Linux内核编程打印所有线程信息
轉自:https://blog.csdn.net/Tryantking/article/details/80027214
一、打印系統中所有內核線程的程序名、PID 號、進程狀態及進程優先級、父進程的PID
1、首先,我們開始編寫模塊代碼pPid.c,這是Linux內核編程的核心代碼,代碼如下:
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/init_task.h> // 初始化函數 static int hello_init(void) {struct task_struct *p;p = NULL;p = &init_task;printk(KERN_ALERT"名稱\t進程號\t狀態\t優先級\t父進程號\t");for_each_process(p){if(p->mm == NULL){ //內核線程的mm成員為空printk(KERN_ALERT"%s\t%d\t%ld\t%d\n",p->comm,p->pid, p->state,p->normal_prio,p->parent->pid);}}return 0; } // 清理函數 static void hello_exit(void) {printk(KERN_ALERT"goodbye!\n"); }// 函數注冊 module_init(hello_init); module_exit(hello_exit); // 模塊許可申明 MODULE_LICENSE("GPL");2、頭文件的聲明,module.h包含了大量加載模塊所需要的函數和符號的定義;init.h包含了模塊初始化和清理函數的定義。如果模塊加載時允許用戶傳遞參數,模塊還應該包含moduleparam.h頭文件。
3、接下來我們需要初始化函數,task_struct 結構定義在/usr/src/linux4.4.19/include/linux/sched.h 中,所以也需要在頭文件加入這個庫,而這個結構也包含了我們需要使用的PID之類的值,可以直接調用。當然了,這兩篇文章可以更好理解這個結構:
https://blog.csdn.net/npy_lp/article/details/7292563
https://blog.csdn.net/npy_lp/article/details/7335187
接下來,我們需要對我們定義的結構p初始化指針,否則會產生也指針,文件也會報錯,因此,我們需要用到init_task,并且在頭文件加入init_task.h庫。
4、然后,我們用for_each_process遍歷我們的每一個進程,并輸出我們需要得到的進程信息。
5、最后是函數注冊已經模塊許可聲明,這是必須加入的。
6、編譯Makefile
?
7、make后使用insmod加入模塊
8、dmesg顯示使用情況,如圖所示
二、 以某個進程的 PID 號為參數,列出該進程的家族信息,包括父進程、兄弟進程和子進程的程序名、PID 號
1、代碼如下:
#include<linux/init.h> #include<linux/module.h> #include<linux/kernel.h> #include <linux/sched.h> #include <linux/moduleparam.h>static pid_t pid=1; module_param(pid,int,0644);static int hello_init(void) {struct task_struct *p;struct list_head *pp;struct task_struct *psibling;// 當前進程的 PIDp = pid_task(find_vpid(pid), PIDTYPE_PID);printk("me: %d %s\n", p->pid, p->comm);// 父進程if(p->parent == NULL) {printk("No Parent\n");}else {printk("Parent: %d %s\n", p->parent->pid, p->parent->comm);}// 兄弟進程list_for_each(pp, &p->parent->children){psibling = list_entry(pp, struct task_struct, sibling);printk("sibling %d %s \n", psibling->pid, psibling->comm);}// 子進程list_for_each(pp, &p->children){psibling = list_entry(pp, struct task_struct, sibling);printk("children %d %s \n", psibling->pid, psibling->comm);}return 0; }static void hello_exit(void) {printk(KERN_ALERT"goodbye!\n"); }module_init(hello_init); module_exit(hello_exit);MODULE_LICENSE("GPL");2、查看當前進程的父進程
if(p->parent == NULL) {printk("No Parent\n"); } else {printk("Parent: %d %s\n", p->parent->pid, p->parent->comm); }3、查找當前進程的兄弟進程
list_for_each(pp, &p->parent->children) {psibling = list_entry(pp, struct task_struct, sibling);printk("sibling %d %s \n", psibling->pid, psibling->comm); }4、查找當前進程的子進程
list_for_each(pp, &p->children) {psibling = list_entry(pp, struct task_struct, sibling);printk("children %d %s \n", psibling->pid, psibling->comm); }5、編譯模塊并插入模塊后,使用dmesg查看消息如下:
總結
以上是生活随笔為你收集整理的Linux内核编程打印所有线程信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpstudy(自己电脑主机做服务器,
- 下一篇: 微星刀锋 无法进入bios_夏天来了 微