实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个proc 文件中(遍历可以从 current 当前进程开始,父进程遍历到初始化进程,遍历任务队列可以利用 for_each_process 宏)。
下面是我的内核模块的实现部分:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/jiffies.h>
#include <asm/uaccess.h>
#include <linux/moduleparam.h>
#include <linux/list.h>
#include <linux/sched.h>
#include <asm/current.h>
#define MODULE_NAME "MyProcess"
#define MYDATA_LEN 10000
struct my_proc_data{
char value[MYDATA_LEN];
};
struct my_proc_data mydata,fathers_data;
struct proc_dir_entry *example_dir;
struct proc_dir_entry *date_file;
struct proc_dir_entry *father_file;
static int param;
module_param(param,int,0644);
static int proc_read(char *page,char **start,off_t off,int count,int *eof,void *data)
{
int len;
struct my_proc_data *mydatap = (struct my_poroc_data *)data;
len += sprintf(page,"%s",mydatap->value);
return len;
}
static int proc_write(struct file *file,const char *buffer,unsigned long count,void *data)
{
int len;
struct my_proc_data *mydatap = (struct my_proc_data *)data;
if(count > MYDATA_LEN)
len = MYDATA_LEN;
else
len = count;
if(copy_from_user(mydatap->value,buffer,len)){
return -EFAULT;
}
mydatap->value[len-1] = '\0';
return len;
}
int init_module(void)
{
example_dir = (struct proc_dir_entry *)proc_mkdir("mydir",0);
if(example_dir == 0){
printk("mkdir fail!!\n");
return -1;
}
date_file = (struct proc_dir_entry *)create_proc_entry("myfile",0666,example_dir);
if(date_file == 0){
printk("create file fails!!\n");
return -ENOMEM;
}
father_file = (struct proc_dir_entry *)create_proc_entry("fathers",0666,example_dir);
if(father_file == 0){
printk("create file fails!!\n");
return -ENOMEM;
}
struct task_struct *pos = get_current();
for_each_process(pos){
strcat(mydata.value,pos->comm);
strcat(mydata.value,"\n");
}
date_file->data = &mydata;
date_file->read_proc = &proc_read;
date_file->write_proc = &proc_write;
date_file->owner = THIS_MODULE;
pos = get_current();
while(pos != &init_task){
strcat(fathers_data.value,pos->parent->comm);
strcat(fathers_data.value,"=>");
strcat(fathers_data.value,pos->comm);
strcat(fathers_data.value,"\n");
pos = pos->parent;
}
father_file->data = &fathers_data;
father_file->read_proc = &proc_read;
father_file->write_proc = &proc_write;
father_file->owner = THIS_MODULE;
return 0;
}
void cleanup_module(void)
{
remove_proc_entry("myfile",example_dir);
remove_proc_entry("fathers",example_dir);
remove_proc_entry("mydir",NULL);
printk("GoodBye!!\n");
}
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("This is the description");
MODULE_AUTHOR("bobo");
其中的Makefile文件为:
obj-m := process.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
现在我们使用make命令编译,编译完成时候,我们动态加载内核模块
sudo insmod process.ko
然后我们查看proc文档下我们创建的文件:
cat /proc/mydir/myfile
运行后的效果为:
下面我们查看一下所有的父进程的文件:
cat /proc/mydir/fathers
运行效果为:
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
Linux内核模块与_proc文件系统.pdf
使用 proc 文件系统来访问 Linux 内核的内容使用 proc 文件系统来访问 Linux 内核的内容使用 proc 文件系统来访问 Linux 内核的内容使用 proc 文件系统来访问 Linux 内核的内容使用 proc 文件系统来访问 Linux 内核...
调用了linux内核提供的操作proc文件系统接口的函数,一个小例子。
Lsmod通过读取 /proc/modules文件的内容来查看内核已经加载了哪些内核模块。操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod执行 modprobe去加载内核模块。
/proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux® 内核空间和用户空间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件...
linux Proc 文件系统 内核对Proc 文件系统的函数
proc 文件系统 proc 文件系统 proc 文件系统 proc 文件系统 proc 文件系统
Linux操作系统内核实验--proc文件系统实验: 问题A: 提取 1、cpu类型 2、内核版本 问题B: 1、启动以来经历的时间,以dd:hh:mm:ss报告 问题C: 1、cpu执行用户态、系统态、空闲态所用时间 2、多少次磁盘请求 3、多少...
/proc文件系统简单应用-内核空间和用户空间之间的数据交互 http://edsionte.com/techblog/archives/3030 /proc文件系统简单应用-内核空间和用户空间之间的数据交互 http://edsionte.com/techblog/archives/3030/proc...
proc文件系统讲解,非常详细。 1 收集系统信息 1.0 proc文件系统概览 1.1 进程相关信息子目录 1.2 内核数据 1.3 IDE接口信息 /proc/ide 1.4 网络统计信息 /proc/net 1.5 SCSI接口信息 /proc/scsi 1.6 并行端口信息 /...
虽然对大多数用户我们不建议更改和重新编译内核源代码,但是Linux内核提供了另一种方法来调整内核参数。Proc文件系统提供了一个运行的内核的接口,可以被用来检测和修改内核参数。
一个LINUX模块例子内核模块时LINUX提供给用户动态扩充内核的一种机制。利用模块在PROC文件系统中挂接一个能读取系统时钟的文件。
1.1 内核模块的Makefiles文件 146 1.2 多重文件内核模块 147 第2章 字符设备文件 149 第3章 /proc文件系统 158 第4章 把/proc用于输入 162 第5章 把设备文件用于输入 170 第6章 启动参数 182 第7章 系统调用 185 第8...
proc文件系统介绍,内核态与用户态交互过程
linux proc文件系统简介 linux proc文件系统简介
通过读取/proc文件,获得系统信息 监控系统状态,显示系统中若干部件的使用情况。 用GTK库的图形界面显示系统监控状态。
1.掌握简单字符设备驱动程序中模块参数及Proc文件系统的编写方法。 2.学习利用模块参数进行驱动程序参数传递,学习利用Proc文件系统进行数据读写。 二、实验环境 Linux 3.14.0 嵌入式开发板 三、实验内容及实验...
主要内容是:详细讲解linux的proc文件系统
Linux内核驱动模块编程指南 (内核版本2.2, 2.4) The Linux Kernel Module Programming Guide CHS Linux内核驱动模块编程指南 (内核版本2.2, 2.4) Peter Jay Salzman Ori Pomerantz 版权 © 2001 Peter Jay Salzman...
在linux下,如何使用proc文件系统与内核态进行通信,介绍proc程序的一般写法。