日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内核编程打印所有线程信息

發布時間:2023/12/10 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
?

obj-m:=pPid.o KERNELBUILD :=/lib/modules/$(shell uname -r)/build default: make -C $(KERNELBUILD) M=$(shell pwd) modules clean:rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

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内核编程打印所有线程信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。