内核模块遍历进程和任务队列保存到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

运行效果为:

目录
相关文章
|
14天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
15天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
49 4
|
16天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
20天前
|
算法 调度
探索操作系统的心脏:内核与进程管理
【10月更文挑战第25天】在数字世界的复杂迷宫中,操作系统扮演着关键角色,如同人体中的心脏,维持着整个系统的生命力。本文将深入浅出地剖析操作系统的核心组件——内核,以及它如何通过进程管理来协调资源的分配和使用。我们将从内核的概念出发,探讨它在操作系统中的地位和作用,进而深入了解进程管理的机制,包括进程调度、状态转换和同步。此外,文章还将展示一些简单的代码示例,帮助读者更好地理解这些抽象概念。让我们一起跟随这篇文章,揭开操作系统神秘的面纱,理解它如何支撑起我们日常的数字生活。
|
2月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
2月前
|
算法 调度 Python
探索操作系统的内核——一个简单的进程调度示例
【9月更文挑战第17天】在这篇文章中,我们将深入探讨操作系统的核心组件之一——进程调度。通过一个简化版的代码示例,我们将了解进程调度的基本概念、目的和实现方式。无论你是初学者还是有一定基础的学习者,这篇文章都将帮助你更好地理解操作系统中进程调度的原理和实践。
|
2月前
crash —— 查看进程的内核栈的内容
crash —— 查看进程的内核栈的内容
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
4月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
167 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
3月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。