2021-10-18
linux实验二proc
Makefile:
ifneq ($(KERNELRELEASE),)
obj-m := tasklist.o else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules rm -r -f .tmp_versions *.mod.c .*.cmd *.o *.symvers endif
tasklist.c:
//-------------------------------------------------------------------
// tasklist.c: 本内核文件创建一个proc伪文件,'/proc/tasklist'
// 通过如下命令可以显示系统中所有进程的部分信息
// 注意:Mkefile文件必须正确放置在当前目录下。
// 编译命令: make
// 内核模块添加:$sudo insmod tasklist.ko
// 添加内核模块后读取并信息tasklist内核信息: $ cat /proc/tasklist
// 内核模块删除:$sudo rmmod tasklist
// NOTE: Written and tested with Linux kernel version 3.13.0 and.3.2.0
// 用户也可以自己完成相关的读写程序,就像课后练习1要求的。我们尤其鼓励同学自己写程序代替cat程序。
// strace函数可用于追踪系统调用,命令格式如下所示:
// $ strace cat /proc/tasklist
//-------------------------------------------------------------------#include <linux/module.h> // for init_module()
#include <linux/proc_fs.h> // for create_proc_info_entry()
#include <linux/sched.h> // for init_task
#include <linux/seq_file.h> // for sequence files
#include <linux/slab.h> // for kzalloc, kfree char modname[] = "tasklist";
struct task_struct *task;
int taskcounts=0; // 'global' so value will be retainedstatic void * my_seq_start(struct seq_file *m, loff_t *pos)
{///printk(KERN_INFO"Invoke start\n"); //可以输出调试信息if ( *pos == 0 ) // 表示遍历开始{task = &init_task; //遍历开始的记录地址return &task; //返回一个非零值表示开始遍历}else //遍历过程中{ if (task == &init_task ) //重新回到初始地址,退出return NULL;return (void*)pos ;//否则返回一个非零值}
}
static int my_seq_show(struct seq_file *m, void *v)
{//获取进程的相关信息//printk(KERN_INFO"Invoke show\n"); seq_printf( m, "#%-3d ", taskcounts++ ); seq_printf( m, "%5d ", task->pid );seq_printf( m, "%lu ", task->state );seq_printf( m, "%-15s ", task->comm );seq_puts( m, "\n" ); return 0;
}static void * my_seq_next(struct seq_file *m, void *v, loff_t *pos)
{//printk(KERN_INFO"Invoke next\n"); (*pos)++; task= next_task(task); //指向下一个进程return NULL;}
static void my_seq_stop(struct seq_file *m, void *v)
{//printk(KERN_INFO"Invoke stop\n"); // do nothing
}static struct seq_operations my_seq_fops = {//序列文件记录操作函数集合.start = my_seq_start,.next = my_seq_next,.stop = my_seq_stop,.show = my_seq_show
};static int my_open(struct inode *inode, struct file *file)
{ return seq_open(file, &my_seq_fops); //打开序列文件并关联my_seq_fops
} static const struct file_operations my_proc =
{ //proc文件操作函数集合.owner = THIS_MODULE, .open = my_open,.read = seq_read, .llseek = seq_lseek,.release = seq_release
}; int __init my_init( void )
{struct proc_dir_entry* my_proc_entry;printk( "<1>\nInstalling \'%s\' module\n", modname );my_proc_entry = proc_create(modname, 0x644, NULL, &my_proc);//生成proc文件if (NULL == my_proc_entry){return -ENOMEM;}return 0; //SUCCESS
}void __exit my_exit( void )
{remove_proc_entry( modname, NULL );//删除proc文件printk( "<1>Removing \'%s\' module\n", modname );
}module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
tasklist.c.bak:
//-------------------------------------------------------------------
// tasklist.c: 本内核文件创建一个proc伪文件,'/proc/tasklist'
// 通过如下命令可以显示系统中所有进程的部分信息
// 注意:Mkefile文件必须正确放置在当前目录下。
// 编译命令: make
// 内核模块添加:$sudo insmod tasklist.ko
// 添加内核模块后读取并信息tasklist内核信息: $ cat /proc/tasklist
// 内核模块删除:$sudo rmmod tasklist
// NOTE: Written and tested with Linux kernel version 3.13.0 and.3.2.0
// 用户也可以自己完成相关的读写程序,就像课后练习1要求的。我们尤其鼓励同学自己写程序代替cat程序。
// strace函数可用于追踪系统调用
// $ strace cat /proc/tasklist
//-------------------------------------------------------------------#include <linux/module.h> // for init_module()
#include <linux/proc_fs.h> // for create_proc_info_entry()
#include <linux/sched.h> // for init_task
#include <linux/seq_file.h> // for sequence files
#include <linux/slab.h> // for kzalloc, kfree char modname[] = "tasklist";
struct task_struct *task;
int taskcounts=0; // 'global' so value will be retainedstatic void * my_seq_start(struct seq_file *m, loff_t *pos)
{///printk(KERN_INFO"Invoke start\n"); //可以输出调试信息if ( *pos == 0 ) // 表示遍历开始{task = &init_task; //遍历开始的记录地址return &task; //返回一个非零值表示开始遍历}else //遍历过程中{ if (task == &init_task ) //重新回到初始地址,退出return NULL;return (void*)pos ;//否则返回一个非零值}
}
static int my_seq_show(struct seq_file *m, void *v)
{//获取进程的相关信息//printk(KERN_INFO"Invoke show\n"); seq_printf( m, "#%-3d ", taskcounts++ ); seq_printf( m, "%5d ", task->pid );seq_printf( m, "%lu ", task->state );seq_printf( m, "%-15s ", task->comm );seq_puts( m, "\n" ); return 0;
}static void * my_seq_next(struct seq_file *m, void *v, loff_t *pos)
{//printk(KERN_INFO"Invoke next\n"); (*pos)++; task= next_task(task); //指向下一个进程return NULL;}
static void my_seq_stop(struct seq_file *m, void *v)
{//printk(KERN_INFO"Invoke stop\n"); // do nothing
}static struct seq_operations my_seq_fops = {//序列文件记录操作函数集合.start = my_seq_start,.next = my_seq_next,.stop = my_seq_stop,.show = my_seq_show
};static int my_open(struct inode *inode, struct file *file)
{ return seq_open(file, &my_seq_fops); //打开序列文件并关联my_seq_fops
} static const struct file_operations my_proc =
{ //proc文件操作函数集合.owner = THIS_MODULE, .open = my_open,.read = seq_read, .llseek = seq_lseek,.release = seq_release
}; int __init my_init( void )
{struct proc_dir_entry* my_proc_entry;printk( "<1>\nInstalling \'%s\' module\n", modname );my_proc_entry = proc_create(modname, 0x644, NULL, &my_proc);//生成proc文件if (NULL == my_proc_entry){return -ENOMEM;}return 0; //SUCCESS
}void __exit my_exit( void )
{remove_proc_entry( modname, NULL );//删除proc文件printk( "<1>Removing \'%s\' module\n", modname );
}module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
2021-10-18相关推荐
- Android 发布Google Play 应用市场(2021.10.18)
准备材料 [市场注册](https://developer.android.google.cn/distribute/console) [市场登录](https://play.google.com/c ...
- 2021.10.18股票小计
今天新股开盘了很是开心,可惜操作水平还是不够,一直犹豫犹豫,哈哈,在开盘没挂单,几乎挂在了最低点上,还是得吸取教训,下次就在开盘或者10分钟内卖出,还是欠果断,太犹豫哈,得改一改.新股百普赛斯开盘19 ...
- 游戏AI车辆(Auto Mobile City)项目开发日志(2021.10.18)
文章目录 前言 今天实现的内容: 样条线控制的车辆AI原型 PID控制器 红绿灯系统 接下来的计划: 前言 这是一个ai车辆项目,将包含几种不同行为模式的AI车辆在城市交通场景中运行,你可以理解我我计 ...
- 动力煤浅析+今日交易记录 2021.10.18
最近,在动荡的期货市场中,动力煤的跌宕起伏十分诱人.作为最开始买卖期货就选择了动荡较大的黑色系的(较为胆小的)操手小白,我也是和大家一样,对动煤同样眼馋又有些畏惧,所以我默默地了解信息,盯着动煤的走向 ...
- 中文书籍对《人月神话》的引用(2021.10.18更新共120本):告别失控、重构极限编程……
<人月神话>于1975年出版,1995年出二十周年版.自出版以来,该书被大量的书籍和文章引用,直到现在热潮不退. UMLChina摘录目前为止正式出版的软件开发各领域中文书籍中对<人 ...
- Day19-22 2021/10/13-16 JAVA贪吃蛇 全注释版
Day19-22 2021/10/13-16 贪吃蛇 帧:如果时间足够小 就是动画 键盘监听 定时器 Timer package snale; import javax.swing.*; /*** @ ...
- 2021.10.25-10.31 AI行业周刊(第69期):AI进化之路
本周<Opencv基础及AI项目实战>以及<Pytorch模型推理及多任务通用范式>两门课程已经完结. 两门课程中,针对所有完成作业的同学,都颁发了毕业证书. 并且对于完成比较 ...
- 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...
- Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》
来自TIOBE的最新10月份统计数据显示,Python首次超越Java.JavaScript.C语言等,成为最受欢迎的编程语言.TIOBE过去20年一直在追踪编程语言的受欢迎程度,其数据来自于对25个 ...
- uboot 2021.10源码分析(启动流程)
uboot版本:2021.10 平台:armv8 rk3399 eMMC 16G LPDDR4 4G 本文主要基于uboot的执行流程进行分析而忽略了相关细节,从uboot的基本框架结构着手,新 ...
最新文章
- ISA---不能访问网址或是多次刷新才能访问的解决方法一则
- pip报 No module named ‘pip‘ 错误
- 2015-03-19 header note update in my Appointment
- asp 判断数组等于_如何在 ASP.NET Core MVC 中处理 404 错误
- (转载)今天的不在家呢的即时通讯
- 最大化/最小化/关闭窗口代码集锦
- error LNK2019: 无法解析的外部符号 _WinMain,在函数_tmainCRTStartup中被引用
- 全网搜php,FM全网自动采集聚合影视搜索ThinkPHP源码
- BAT 批处理注释命令rem、@rem和::
- bilibili助手C2C服务器,Bilibili助手
- Travelling not wandering
- .Net培训班课程体系
- html表ge模板_40多个漂亮的网页表单设计实例
- ELK日志分析平台之kibana以及借助ELK平台实现网站访问量统计
- Find My资讯|苹果AirTag再立功破案,Find My对物品丢失say no
- drag与drop事件
- PHP ob缓存页面静态化技术
- 收藏功能前端实现代码
- NOJ 1116 哈罗哈的大披萨 【淡蓝】 状态压缩DP
- 单片机与 PC 机串口通信实验
热门文章
- ucint核心边缘分析_ucinet社会网络分析笔记(一)网络密度、中心度、凝聚子群、核心-边缘...
- 2020最新录制原生淘宝客APP视频搭建教程【最新原创】
- 算法设计与分析之线性时间选择(C++)
- D1~D5 CIF 720P~1080P 视频各格式参数
- python飞机大战项目概述需求_飞机大战需求分析报告.doc
- Java课程设计-学生成绩管理系统
- php session超时设置,php如何设置session超时过期时间
- ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
- Unity编辑器扩展-基本界面编写
- 在电脑上怎么做报表新手_在电脑上如何制作表格_电脑制作表格的步骤教程-系统城...