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

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45766609 实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个proc 文件中(遍历可以从 current 当前进程开始,父进程遍历到初始化进程,遍历任务队列可以利用 for_each_process 宏)。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45766609

实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个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

运行效果为:

目录
相关文章
|
2月前
|
消息中间件 存储 算法
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
【软件设计师备考 专题 】操作系统的内核(中断控制)、进程、线程概念
84 0
|
2天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
7 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
2天前
|
Linux 调度 数据库
|
2天前
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
8 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
|
2天前
|
Linux API 调度
进程,任务
进程,任务
8 1
|
11天前
|
算法 大数据 Linux
深入理解Linux内核的进程调度机制
【4月更文挑战第30天】操作系统的核心职能之一是有效地管理和调度进程,确保系统资源的合理分配和高效利用。在众多操作系统中,Linux因其开源和高度可定制的特点,在进程调度机制上展现出独特优势。本文将深入探讨Linux内核中的进程调度器——完全公平调度器(CFS),分析其设计理念、实现原理及面临的挑战,并探索未来可能的改进方向。
|
11天前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
|
11天前
|
算法 Linux 调度
探索Linux内核:进程调度的奥秘
【4月更文挑战第30天】 在多任务操作系统中,进程调度是核心功能之一,它决定了处理器资源的分配。本文深入分析了Linux操作系统的进程调度机制,从调度器的基本原理到复杂的调度策略,以及它们如何影响系统性能和用户体验。通过剖析进程优先级、时间片分配以及实时性要求等方面,揭示了Linux如何在众多运行着的进程中做出快速而公平的决策,确保系统的高效与稳定运行。
|
24天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
29天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。