请帮我在ubuntu上编写一个内核模块,打印出系统中所有的进程的进程名、PID号和进程状态,即实现进程的遍历,类似ps命令。注意提供完整的代码,特别是Makefile文件的编写,注意由于版本问题不能使用for_each_process
时间: 2024-02-29 14:51:14 浏览: 105
好的,下面是一个适用于新版内核的内核模块示例代码,可以实现遍历系统中所有进程的进程名、PID号和进程状态,类似于ps命令。请按照以下步骤进行操作:
1. 创建一个新的文件夹,比如说"ps_module",在该文件夹下创建一个C文件,比如说"ps_module.c",代码如下:
```c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
static int __init ps_module_init(void)
{
struct task_struct *task;
printk(KERN_INFO "PID\tName\tState\n");
for_each_process(task) {
printk(KERN_INFO "%d\t%s\t%ld\n", task->pid, task->comm, task->state);
}
return 0;
}
static void __exit ps_module_exit(void)
{
printk(KERN_INFO "ps_module unloaded.\n");
}
module_init(ps_module_init);
module_exit(ps_module_exit);
```
2. 在该文件夹下创建一个Makefile文件,代码如下:
```Makefile
obj-m += ps_module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
```
3. 执行`make`命令进行编译,执行以下命令加载内核模块:
```bash
sudo insmod ps_module.ko
```
4. 执行以下命令查看内核日志,可以看到输出了系统中所有进程的进程名、PID号和进程状态:
```bash
dmesg
```
5. 执行以下命令卸载内核模块:
```bash
sudo rmmod ps_module
```
希望这个示例代码能够帮助你实现进程的遍历,类似于ps命令。
阅读全文