两个模块编程实验-Linux(18)

匿名 (未验证) 提交于 2019-12-02 21:59:42
  • 本博文的相关操作均是我亲为的来,你萌在跟着做的时候,如果遇到问题可以随时留言,一起探讨

提出问题:

  1. 设计一个模块,要求列出系统中所有内核线程的程序名,PID,进程状态,进程优先级,父进程的PID。(不带参数的模块)
  2. 设计一个带参数的模块,其参数为某个进程的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

查看日志消息

卸载模块后

这是我实验课内容,如果有任何不对的地方,欢迎指正

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!