内核模块遍历进程和任务队列保存到proc文件中

实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个proc 文件中(遍历可以从 current 当前进程开始,父进程遍历到初始化进程,遍历任务队列可以利用 for_each_process 宏)。

下面是我的内核模块的实现部分:

/************************************************************
*   使用内核模块从当前进程开始先前遍历,知道找到第一个进程为止  *
*   并将遍历的结果保存到proc文件中                           *
***********************************************************/

#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;

//proc结构变量
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)
{

    //创建dir文件夹
    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

运行效果为:

时间: 2024-07-28 16:42:46

内核模块遍历进程和任务队列保存到proc文件中的相关文章

VB.NET 将JSON格式的字符串保存到XML文件中

1.关于本文 这几天打算写一个工具类JsonXmlHelper,用来进行用XML来保存JSON格式文件的工作.该工具类中要实现2个最主要的函数: 1)将JSON格式的内容写入到地址为address的XML中:WriteJsonToXml 2)把函数1中构造的XML文件恢复成JSON格式文档:RecoverJsonFromXml 函数1的实现将在本文中给出,函数2的实现将在以后发表的博文中给出 2.代码说明 1)添加引用:Newtonsoft.Json.dll 2)导入库 'JSON解析相关函数,

Sql数据保存到Excel文件中

public string ExportExcel( DataSet ds,string saveFileName) { try { if (ds == null) return "数据库为空"; bool fileSaved = false; Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) {

Qt Dom方式写xml,以及保存到xml文件中

#include <QString> #include <QDebug> #include <stdio.h> #include <stdlib.h> #include <QDomDocument> #include <QtXml> //XML DOM的方式 int main(int argc, char *argv[]) {     QByteArray array;     QDomDocument doc;     QDomPr

php下载图片生成原始路径 并将下载过的图片路径保存到txt文件中

<?php //header("content-Type: text/html; charset=utf-8"); @ini_set('date.timezone', 'Asia/Shanghai'); @set_time_limit(0); @ini_set('memory_limit','100M'); $headurl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]; $headurl

java将已有的字符串保存到txt文件中

python网络爬虫-通过互联网采集 RMQ算法的学习(区间最值问题)NYOJ119士兵杀敌(三) JAVA常用设计模式 Java多线程知识要点 9fw谀泄牡http://p.baidu.com/itopic/main/center?uid=15fe616263346630323931e4ac&qizj夹餐智p7k9e6律犹媒http://p.baidu.com/itopic/main/center?uid=6bfe616263386334303438e5ac&8q90潦卓嚷v5uuq9轮

转:ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件

本篇将使用上节http://www.cnblogs.com/wenjingu/p/3977015.html中编译好的库文件通过rtsp获取网络上的h464裸流并保存到mp4文件中. 1.VS2010建立VC++  win32控制台项目 2.在工程目录下建立lib目录和include目录,将已编译好的lib拷打lib下,include拷到include下,dll拷到Debug目录下 3.工程属性--配置属性--VC++目录--包含目录,添加ffmpeg头文件目录及其他第三方头文件目录 链接器--常

关于爬取数据保存到json文件,中文是unicode解决方式

流程: 爬取的数据处理为列表,包含字典.里面包含中文, 经过json.dumps,保存到json文件中, 发现里面的中文显示未\ue768这样子 查阅资料发现,json.dumps 有一个参数.ensure_ascii =true,  它会将不是ascii字符的转义为json 字符串. 如果是false ,不是ascii字符的会包含在里面,即如果是中文就会保存中文. 但是我认为json这样写是有道理的. 用requests模块, requests.post(url,json=handled_da

np.savetxt()——将array保存到txt文件,并保持原格式

问题:1.如何将array保存到txt文件中?2.如何将存到txt文件中的数据读出为ndarray类型? 需求:科学计算中,往往需要将运算结果(array类型)保存到本地,以便进行后续的数据分析. 解决:直接用numpy中的方法. 1:numpy.savetxt(fname,X):第一个参数为文件名,第二个参数为需要存的数组(一维或者二维). 2.numpy.loadtxt(fname):将数据读出为array类型. 示例 >>> import numpy as np >>&

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件

shell脚本每隔2s获取某个进程的cpu和mem数据并保存到csv文件 shell脚本如下echo "%CPU,%MEM" > cpu_test.csvpid=1 #Can be change by yourselfwhile true do top -bn1 -n 1 -p $pid | tail -1 | awk '{ print $9,$10 }' | sed 's/ /,/' >> cpu_test.csv sleep 2 #delay timedone 脚