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相关推荐

  1. Android 发布Google Play 应用市场(2021.10.18)

    准备材料 [市场注册](https://developer.android.google.cn/distribute/console) [市场登录](https://play.google.com/c ...

  2. 2021.10.18股票小计

    今天新股开盘了很是开心,可惜操作水平还是不够,一直犹豫犹豫,哈哈,在开盘没挂单,几乎挂在了最低点上,还是得吸取教训,下次就在开盘或者10分钟内卖出,还是欠果断,太犹豫哈,得改一改.新股百普赛斯开盘19 ...

  3. 游戏AI车辆(Auto Mobile City)项目开发日志(2021.10.18)

    文章目录 前言 今天实现的内容: 样条线控制的车辆AI原型 PID控制器 红绿灯系统 接下来的计划: 前言 这是一个ai车辆项目,将包含几种不同行为模式的AI车辆在城市交通场景中运行,你可以理解我我计 ...

  4. 动力煤浅析+今日交易记录 2021.10.18

    最近,在动荡的期货市场中,动力煤的跌宕起伏十分诱人.作为最开始买卖期货就选择了动荡较大的黑色系的(较为胆小的)操手小白,我也是和大家一样,对动煤同样眼馋又有些畏惧,所以我默默地了解信息,盯着动煤的走向 ...

  5. 中文书籍对《人月神话》的引用(2021.10.18更新共120本):告别失控、重构极限编程……

    <人月神话>于1975年出版,1995年出二十周年版.自出版以来,该书被大量的书籍和文章引用,直到现在热潮不退. UMLChina摘录目前为止正式出版的软件开发各领域中文书籍中对<人 ...

  6. Day19-22 2021/10/13-16 JAVA贪吃蛇 全注释版

    Day19-22 2021/10/13-16 贪吃蛇 帧:如果时间足够小 就是动画 键盘监听 定时器 Timer package snale; import javax.swing.*; /*** @ ...

  7. 2021.10.25-10.31 AI行业周刊(第69期):AI进化之路

    本周<Opencv基础及AI项目实战>以及<Pytorch模型推理及多任务通用范式>两门课程已经完结. 两门课程中,针对所有完成作业的同学,都颁发了毕业证书. 并且对于完成比较 ...

  8. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  9. Python 最近两条好消息:①TIOBE排名超过C和Java②新版本发布3.10.0,还有今天刚发布的《What’s New in Python(2021.10.15)》

    来自TIOBE的最新10月份统计数据显示,Python首次超越Java.JavaScript.C语言等,成为最受欢迎的编程语言.TIOBE过去20年一直在追踪编程语言的受欢迎程度,其数据来自于对25个 ...

  10. uboot 2021.10源码分析(启动流程)

    uboot版本:2021.10 平台:armv8  rk3399  eMMC 16G  LPDDR4 4G 本文主要基于uboot的执行流程进行分析而忽略了相关细节,从uboot的基本框架结构着手,新 ...

最新文章

  1. ISA---不能访问网址或是多次刷新才能访问的解决方法一则
  2. pip报 No module named ‘pip‘ 错误
  3. 2015-03-19 header note update in my Appointment
  4. asp 判断数组等于_如何在 ASP.NET Core MVC 中处理 404 错误
  5. (转载)今天的不在家呢的即时通讯
  6. 最大化/最小化/关闭窗口代码集锦
  7. error LNK2019: 无法解析的外部符号 _WinMain,在函数_tmainCRTStartup中被引用
  8. 全网搜php,FM全网自动采集聚合影视搜索ThinkPHP源码
  9. BAT 批处理注释命令rem、@rem和::
  10. bilibili助手C2C服务器,Bilibili助手
  11. Travelling not wandering
  12. .Net培训班课程体系
  13. html表ge模板_40多个漂亮的网页表单设计实例
  14. ELK日志分析平台之kibana以及借助ELK平台实现网站访问量统计
  15. Find My资讯|苹果AirTag再立功破案,Find My对物品丢失say no
  16. drag与drop事件
  17. PHP ob缓存页面静态化技术
  18. 收藏功能前端实现代码
  19. NOJ 1116 哈罗哈的大披萨 【淡蓝】 状态压缩DP
  20. 单片机与 PC 机串口通信实验

热门文章

  1. ucint核心边缘分析_ucinet社会网络分析笔记(一)网络密度、中心度、凝聚子群、核心-边缘...
  2. 2020最新录制原生淘宝客APP视频搭建教程【最新原创】
  3. 算法设计与分析之线性时间选择(C++)
  4. D1~D5 CIF 720P~1080P 视频各格式参数
  5. python飞机大战项目概述需求_飞机大战需求分析报告.doc
  6. Java课程设计-学生成绩管理系统
  7. php session超时设置,php如何设置session超时过期时间
  8. ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
  9. Unity编辑器扩展-基本界面编写
  10. 在电脑上怎么做报表新手_在电脑上如何制作表格_电脑制作表格的步骤教程-系统城...