- 本博文的相关操作均是我亲为的来,你萌在跟着做的时候,如果遇到问题可以随时留言,一起探讨
提出问题:
- 设计一个模块,要求列出系统中所有内核线程的程序名,PID,进程状态,进程优先级,父进程的PID。(不带参数的模块)
- 设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信息,包括父进程,兄弟进程和子进程的程序名,PID号,进程状态。(带参数的模块)
如果还没有掌握基础模块编程技能,看看这个吧
https://blog.csdn.net/babybabyup/article/details/80537149
在目录/os/first_dir
下,用户名为root
编辑 first.c
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> static int first_init(void) { struct task_struct *p; p=NULL; printk(KERN_ALERT"first start"); printk(KERN_ALERT"名称\t进程号\t状态\t优先级\t父进程PID"); for_each_process(p){ printk(KERN_ALERT"%s\t%d\t%d\t%d\t%d\n",p->comm,p->pid, p->state,p->prio,p->parent->pid); } return 0; } static void first_exit(void) { printk(KERN_ALERT"first exit"); } module_init(first_init); module_exit(first_exit); MODULE_LICENSE("GPL");
在相同目录下编辑Makefile
obj-m :=fir.o fir-objs:=first.o KDIR:=/lib/modules/$(shell uname -r)/build PWD:=$(shell pwd) default: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean
最后,安装验证代码正确性啦,
以及卸载模块后:
在目录/os/second_dir
,用户名为root
,编辑second.c
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/moduleparam.h> #include <linux/list.h> static int pid; module_param(pid, int ,0644); static int se_init(void) { struct task_struct *ts; struct pid *p; p=find_get_pid(pid); ts=pid_task(p,PIDTYPE_PID); struct task_struct *parent; printk(KERN_ALERT "second start!"); parent=ts->parent; printk(KERN_ALERT"父名称\t进程号\t状态\t优先级\t\n"); printk(KERN_ALERT"%s\t%d\t%d\t%d\n",parent->comm,parent->pid,parent->state,parent->prio); struct task_struct *list_sibling; struct list_head *pos_sibling; printk(KERN_ALERT"兄弟名称\t进程号\t状态\t优先级\t\n"); list_for_each(pos_sibling,&ts->sibling){ list_sibling=list_entry(pos_sibling,struct task_struct,sibling); printk(KERN_ALERT"%s\t%d\t%d\t%d\n",list_sibling->comm,list_sibling->pid,list_sibling->state,list_sibling->prio); } struct task_struct *list_children; struct list_head *pos_children; printk(KERN_ALERT"孩子名称\t进程号\t状态\t优先级\t\n"); list_for_each(pos_children,&ts->children){ list_children=list_entry(pos_children,struct task_struct,sibling); printk(KERN_ALERT"%s\t%d\t%d\t%d\n",list_children->comm,list_children->pid,list_children->state,list_children->prio); } return 0; } static void se_exit(void) { printk(KERN_ALERT "second exit\n"); } module_init(se_init); module_exit(se_exit); MODULE_LICENSE("GPL");
以及MAkefile
obj-m :=sec.o sec-objs:=second.o KDIR:=/lib/modules/$(shell uname -r)/build PWD:=$(shell pwd) default: make -C $(KDIR) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean
还是老套路,安装,需要注意的是,安装时要传参数:
ins mod sec.ko pid=pidvalue
可以通过
ps -A
查看进程,
我传pid=2884
吧
ins mod sec.ko pid=2884
查看日志消息
卸载模块后
这是我实验课内容,如果有任何不对的地方,欢迎指正
转载请标明出处:两个模块编程实验-Linux(18)
文章来源: 两个模块编程实验-Linux(18)