linux下增加一个新的系统调用实现pstree功能
2017-12-17 22:44
483 查看
这是我们linux课程的一个作业。
首先得到init进程的task_struct,根据list_for_each可以循环遍历可以的到其所有的子进程的 list_head,根据list_head使用list_entry可以得到其task_struct,在循环的同时,每得到一个进程的task_struct,就递归遍历其子进程的task_struct。在递归的同时,记录递归的深度,根据深度在每个子进程的pid前面加上相应多少的制表符,从而反应进程之间的父子关系。
代码:
实现方式:
根据所学知识,我们知道在内核中添加系统调用主要是修改系统调用表和实现系统调用函数,为此我下载了4.9版本的linux源码,在linux-4.9.9/Documentation/下找到了adding-sys.txt这个增加系统调用的说明文档,找到关键部分如图
对于x86平台,有个特别的说明:
在系统调用表下增加新的系统调用:
其中系统调用号是332.
更新kernel/sys_ni.c文件
最后在kernel/sys.c文件中实现新增加的函数:
makefile文件:
内核的编译:
首先下载linux源码,进入其目录
第一次编译由于没有安装ncurses库,会报错
安装ncurses
sudo apt-get install libncurses5-dev
生成内核配置文件
make menuconfig
如果是不是第一次配置,先运行make mrproper清除之前的配置,然后重新运行make menuconfig
直接选择退出,然后进行内核编译
make -j16
编译完成后,安装模块
make modules_install
make install
完成后重启
reboot
安装内核模块:
编译完成后,安装内核模块:
insmod file_name.ko
卸载内核模块:
rmmod file_name.ko
编写测试代码:
运行截图:
首先得到init进程的task_struct,根据list_for_each可以循环遍历可以的到其所有的子进程的 list_head,根据list_head使用list_entry可以得到其task_struct,在循环的同时,每得到一个进程的task_struct,就递归遍历其子进程的task_struct。在递归的同时,记录递归的深度,根据深度在每个子进程的pid前面加上相应多少的制表符,从而反应进程之间的父子关系。
代码:
int processtree(struct task_struct *p,int b) { int dep=0; //记录递归深度,根据深度决定在打印时候时进程pid前面添加几个制表符 struct list_head *head; for(l=p->children.next;l!=&(p->children);l=l->next)//对父进程循环遍历其子进程 { struct task_struct *t=list_entry(l,struct task_struct,sibling);//根据task_struct中list_head得到其task_struct结构体 while(dep!=0) { printk("\t | %d",dep); //对于每个遍历到的进程,根据深度在其前边添加制表符 } printk("---%d\n",p->pid); //打印遍历到的当前进程,并打印出pid dep+=(processtree(t,b+1)+1); //对于遍历到的子进程,进行递归遍历他的子进程,同时遍历的深度加深 } return dep; }
实现方式:
根据所学知识,我们知道在内核中添加系统调用主要是修改系统调用表和实现系统调用函数,为此我下载了4.9版本的linux源码,在linux-4.9.9/Documentation/下找到了adding-sys.txt这个增加系统调用的说明文档,找到关键部分如图
对于x86平台,有个特别的说明:
在系统调用表下增加新的系统调用:
其中系统调用号是332.
更新kernel/sys_ni.c文件
最后在kernel/sys.c文件中实现新增加的函数:
int processtree(struct task_struct *p,int b) { int dep=0; //记录递归深度,根据深度决定在打印时候时进程pid前面添加几个制表符 struct list_head *head; for(l=p->children.next;l!=&(p->children);l=l->next)//对父进程循环遍历其子进程 { struct task_struct *t=list_entry(l,struct task_struct,sibling);//根据task_struct中list_head得到其task_struct结构体 while(dep!=0) { printk("\t | %d",dep); //对于每个遍历到的进程,根据深度在其前边添加制表符 } printk("---%d\n",p->pid); //打印遍历到的当前进程,并打印出pid dep+=(processtree(t,b+1)+1); //对于遍历到的子进程,进行递归遍历他的子进程,同时遍历的深度加深 } return dep; }
makefile文件:
内核的编译:
首先下载linux源码,进入其目录
第一次编译由于没有安装ncurses库,会报错
安装ncurses
sudo apt-get install libncurses5-dev
生成内核配置文件
make menuconfig
如果是不是第一次配置,先运行make mrproper清除之前的配置,然后重新运行make menuconfig
直接选择退出,然后进行内核编译
make -j16
编译完成后,安装模块
make modules_install
make install
完成后重启
reboot
安装内核模块:
编译完成后,安装内核模块:
insmod file_name.ko
卸载内核模块:
rmmod file_name.ko
编写测试代码:
运行截图:
相关文章推荐
- linux 调用系统函数来实现 ATM 自动取款机功能 (进程间通信)
- Lab4_1树莓派上增加一个Linux系统调用
- linux 调用系统函数来实现 ATM 自动取款机功能 (进程间通信)
- linux采用编译内核的方法增加系统功能调用
- 利用文件操作的系统调用 实现 Linux 中的cp 功能
- 在i386平台Linux 2.6 上实现一个系统调用
- 树梅派 增加一个Linux系统调用
- Linux系统裁减之,制作一个极度精简的Linux-3-为精简的系统增加网络功能和关机重启功能
- Linux之使用内核模块增加一个系统调用
- Linux中实现MSDN的功能查系统调用
- linux采用编译内核的方法增加系统功能调用
- Linux系统学习方法——写给小白 每个人都有心中向往的一些事情,而我,刚进实验室,看到师兄师姐在电脑前面噼里啪啦的敲代码,真的好羡慕,看着他们实现一个又一个的功能满心欢喜,我也很想尝试。后来了解到师
- 如何实现一个新的linux系统调用
- 实现在一个SAP系统中调用其它SAP系统的功能
- 给树莓派增加一个Linux系统调用
- linux下使用系统调用编程实现dir命令功能
- 创建一个学生系统,实现一下功能; * 1:增加学生 * 2:显示学生 * 3:修改学生 * 4:删除学生 * 5:查找学生 * 6:退出程序 * 请输入选择(
- 基于Linux系统调用使用php实现一个在线编译运行C语言程序的系统
- 如何来实现一个Linux内核的系统调用(基于tiny4412开发板)
- linux采用编译内核的方法增加系统功能调用