首页 > 其他分享 >新增/proc文件目录

新增/proc文件目录

时间:2024-01-21 21:12:47浏览次数:36  
标签:文件目录 struct 新增 user include proc hello dir

Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

有时候基于调试方便,可能要新增一个/proc/ 调试接口。这里我随手写一个demo记录下。

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/io.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/slab.h>
#include <linux/seq_file.h> 

/* 定义一个proc_dir_entry结构体类型变量*/
struct proc_dir_entry *hello_proc = NULL;
struct proc_dir_entry *hello_dir = NULL;

/* 定义一个全局数据,用来保存用户空间返回的数据 */
static char hello_data[20] = {};

static int dbg_proc_show(struct seq_file *m, void *v)
{

    seq_printf(m,"hello world!\n");

    return 0;
}


static ssize_t hello_proc_open(struct inode *inode, struct file *file)
{

	return single_open(file, dbg_proc_show, NULL);

}

/* 如果使用cat节点会调用该函数
 */
static ssize_t hello_proc_read(struct file *fp, char __user *user_buf, size_t count, loff_t *ppos)
{
	int ret = 0;
	
	ret = copy_to_user(user_buf,"hello_proc_read",sizeof(hello_proc_read));
	if (ret != 0)
	{
		printk("copy_to_user failed!\r\n");
		return -EFAULT;
	}

    return 0;
}

/*
  用户空间使用echo往此节点写入数据
*/
static ssize_t hello_proc_write(struct file *fp, const char __user *user_buf, size_t count, loff_t *ppos)
{
	int ret;

	ret = copy_from_user(hello_data,user_buf,sizeof(user_buf));
	if (ret != 0)
	{
		printk("copy_from_user failed!\r\n");
		return -EFAULT;
	}
	printk("hello_proc_write:hello_data is %s",hello_data);
    
	return 0;
}

/* 定义一个file_operations结构体变量 */
static const struct file_operations hello_proc_fops = {
    .owner      = THIS_MODULE,
	.open		= hello_proc_open,	//用户态调用open函数时的回调函数
	.read		= hello_proc_read,	//使用cat时的回调函数
	.write      = hello_proc_write,	//使用echo时的回调函数
};

/* 驱动入口函数 */
static int __init proc_test_init(void)
{
	hello_dir = proc_mkdir("hello_dir",NULL);
    hello_proc = proc_create("hello_proc", S_IRUGO | S_IWUGO,NULL,&hello_proc_fops);
    return 0;
}

/* 驱动出口函数 */
static void __exit proc_test_exit(void)
{
	/* 删除此文件 */
	if(hello_proc)
		remove_proc_entry("hello_proc", NULL);
}

module_init(proc_test_init);
module_exit(proc_test_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("proc filesystem test"); 

proc_test_init中我们使用proc_mkdirproc_create创建了/proc/hello_dir/hello_proc调试文件。然后调用定义了hello_proc_fops结构体,填充了open,read,write的回调函数。用户空间使用echo命令时会调用到hello_proc_write。如果使用cat节点会调用hello_proc_read。如果去读/proc/hello_dir/hello_proc节点,会读到hello world

标签:文件目录,struct,新增,user,include,proc,hello,dir
From: https://www.cnblogs.com/dongxb/p/17978372

相关文章

  • 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
    快速对比两个list数据集合此文引用csdn:https://blog.csdn.net/Zhu_daye/article/details/104798410小批量、快速对比两个list数据集合usingSystem.Linq.Expressions;Main();voidMain(){//对比源集合varsource=GenerateStudent(1,10000,1000);//......
  • Process Explorer高级技巧
    ProcessExplorer是一款功能丰富的进程系统工具,远比windows自带的任务管理器强大。  还原线程堆栈 点击菜单Options--ConfigureSymbols... 配置Symbol符号表:srv*D:\Symbols\sys*http://msdl.microsoft.com/download/symbols;D:\Symbols\MyGame然后把MyTest1-Win6......
  • linux修改max user processes limits
    突破ulimit限制修改普通用户单个用户可同时运行的最大进程数(默认为4096)[root@xxxdevops]#cat/etc/security/limits.d/20-nproc.conf#Defaultlimitfornumberofuser'sprocessestoprevent#accidentalforkbombs.#Seerhbz#432903forreasoning.*......
  • pbootcms程序升级新增清理冗余图片清理
    pbootcms程序升级新增清理冗余图片功能调取方法PBOOTCMS最近升级了新的版本,增加了清理冗余图片的功能,但是各位站长更新完后发现后台并没有这个功能。今天微站就教大家如何把这个功能展现出来!看教程。操作教程第一步:打开后台自定义菜单。然后点击菜单新增。<ignore_js_op>......
  • 详解Process object has no attribute '_popen'
    详解Processobjecthasnoattribute'_popen'最近在使用Python的multiprocessing模块进行多进程编程时,遇到了一个奇怪的错误:Processobjecthasnoattribute'_popen'。这个错误消息看起来很奇怪,让人摸不着头脑。错误背景在使用multiprocessing模块创建子进程时,通常会创建一个Pr......
  • Power BI - 5分钟学习新增自定义列
    每天5分钟,今天介绍PowerBI新增自定义列我们在日常工作中有时需要对导入的数据进行额外处理,如两个字符串列拼接【产品编号】+【产品名称】,或者【数据量】*【价格】得到销售值等等。 以计算产品销售为例,导入样例数据,请看样例内容:(Excel数据源导入请参考每天5分钟第一天)。......
  • 多模块之间的循环依赖:java: Annotation processing is not supported for module cycl
    问题描述java:Annotationprocessingisnotsupportedformodulecycles.Pleaseensurethatallmodulesfromcycle[BDCloud-business,BDCloud-admin]areexcludedfromannotationprocessing  本质:BDCloud-admin模块为主启动模块,其包含了BDCloud-business模块;但在......
  • Hologres V2.1版本发布,新增计算组实例构建高可用实时数仓
    Highlight产品介绍Hologres是阿里云自研一站式实时数仓,统一数据平台架构,将OLAP查询、即席分析、在线服务、向量计算多个数据应用构建在统一存储之上,实现一份数据,多种计算场景。V2.1版本简介新增弹性计算组实例,解决实时数仓场景下分析性能、资源隔离、高可用、弹性扩缩容等核心问......
  • dpkg/ error processing package install-info (--configure)/ installed install-inf
    背景介绍在ubuntu20.04中使用apt安装软件时会出现报错dpkg/errorprocessingpackageinstall-info(--configure)/installedinstall-infopackagepost-installationscriptsubprocessreturnederrorexitstatus126这主要是由于不完全安装导致的。解决方式是删除或编辑......
  • 【Azure Data Lake Storage】如何才能保留Blob中的文件目录结构(即使文件夹中文件数量
    问题描述在使用AzureStorageAccountBlob时候,发现当文件夹中的Blob(文件)被全部输出后,文件夹也会消失?为什么它不能像Windows系统中的文件夹一样,即使是一个空文件夹。也会一直保留呢? 问题解答这是因为 AzureStorageAccountBlob对Container下的文件管理采用的是扁平......