linux proc文件系统使用之单次读

Linux内核中的seq操作   Linux内核中的seq操作 本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。msn: yfydz_no1@hotmail.com来源:http://yfydz.cublog.cn1. 前言 在fs/seq_file.c中定义了关于seq 阅读详情

一、proc文件系统

proc文件系统是一种无存储的文件系统,当读其中的文件时,其内容动态生成,当写文件时,文件所关联的写函数被调用。上面说文件关联的读写函数,其实就是在创建对应proc 文件的驱动中实现的。当proc文件时,就相当于调用了,对应驱动的read函数。这里我们不研究proc的实现原理,我也没那么多时间,这里就先会用,后面在来研究它的实现原理吧。感兴趣的话,可以参考博文。

二、几个重要的API

我们现在注重的是编码。针对编码,我们需要熟练掌握的的API有3个,如下所示,如果后面遇到常用的,会在博客上更新。

1.proc_create()

作用:这个函数的作用就是创建proc文件,并将proc文件和fops绑定。

static inline struct proc_dir_entry *proc_create(
           const char *name,     //创建proc文件的名字
           umode_t mode,          //读写权限,例如:读,写,执行
           struct proc_dir_entry *parent,  //父目录,如果为NULL,会在/proc创建proc文件。
           const struct file_operations *proc_fops )  //文件的操作集合,具体可参考例子。
返回值:返回当前proc文件的入口结构体

2.proc_mkdir()

作用:只是在proc下创建文件目录

struct proc_dir_entry *proc_mkdir(
           const char *,  //创建proc目录的名称
           struct proc_dir_entry *);  //父目录
返回值:返回当前目录的入口结构体

3.proc_remove()

作用:见名知意,删除对应的proc文件。

void proc_remove(
           struct proc_dir_entry *de   //要删除结构的入口结构体指针
                                 )
返回值:无

三、例子show time

下面这个例子,我在本地已经验证过。大家要把这个流程熟记于心。先要会写,后在理解。

/*************************************************************************
	> File Name: proc.c
	> Author: armwind
	> Mail: armwind@163.com 
	> Created Time: Tue 16 Aug 2016 19:30:38 CST
 ************************************************************************/

#include <linux/kernel.h>  
#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/proc_fs.h>  //必须要包含的头文件
#include <linux/seq_file.h>  //必须要包含的头文件

static DEFINE_MUTEX(registration_lock);
#define TEST_PROC_FS   //这里我们可以在对应驱动中添加菜单来控制。
#ifdef TEST_PROC_FS
static int test_proc_show(struct seq_file *m, void *v)
{
#if 0  //其实这一段我也是从其它驱动中拿过来的,这里保留原始的code,大家看看它都做了什么。
	struct saa7164_dev *dev;
	struct tmComResBusInfo *b;
	struct list_head *list;
	int i, c;

	if (saa7164_devcount == 0)
		return 0;

	list_for_each(list, &saa7164_devlist) {
		dev = list_entry(list, struct saa7164_dev, devlist);
		seq_printf(m, "%s = %p\n", dev->name, dev);

		/* Lock the bus from any other access */
		b = &dev->bus;
		mutex_lock(&b->lock);

		seq_printf(m, " .m_pdwSetWritePos = 0x%x (0x%08x)\n",    //下面这个可以做很多打印工作,在实际的开发中,我们可以打印任何我们驱动中的信息。
			b->m_dwSetReadPos, saa7164_readl(b->m_dwSetReadPos));

		seq_printf(m, " .m_pdwSetReadPos  = 0x%x (0x%08x)\n",
			b->m_dwSetWritePos, saa7164_readl(b->m_dwSetWritePos));

		seq_printf(m, " .m_pdwGetWritePos = 0x%x (0x%08x)\n",
			b->m_dwGetReadPos, saa7164_readl(b->m_dwGetReadPos));

		seq_printf(m, " .m_pdwGetReadPos  = 0x%x (0x%08x)\n",
			b->m_dwGetWritePos, saa7164_readl(b->m_dwGetWritePos));
		c = 0;
		seq_printf(m, "\n  Set Ring:\n");
		seq_printf(m, "\n addr  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
		for (i = 0; i < b->m_dwSizeSetRing; i++) {
			if (c == 0)
				seq_printf(m, " %04x:", i);

			seq_printf(m, " %02x", *(b->m_pdwSetRing + i));

			if (++c == 16) {
				seq_printf(m, "\n");
				c = 0;
			}
		}

		c = 0;
		seq_printf(m, "\n  Get Ring:\n");
		seq_printf(m, "\n addr  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
		for (i = 0; i < b->m_dwSizeGetRing; i++) {
			if (c == 0)
				seq_printf(m, " %04x:", i);

			seq_printf(m, " %02x", *(b->m_pdwGetRing + i));

			if (++c == 16) {
				seq_printf(m, "\n");
				c = 0;
			}
		}

		mutex_unlock(&b->lock);

	}
#endif
	seq_printf(m, "you can read something here\n");
	seq_printf(m, "you can read something many times\n");
	return 0;
}

static int test_proc_open(struct inode *inode, struct file *filp)
{
	return single_open(filp, test_proc_show, NULL);  //open函数中包含了single_open(),先按着别人这样写就行。
}

static const struct file_operations test_proc_fops = {
	.open		= test_proc_open, 
	.read		= seq_read,  //这个是系统默认的
	.llseek		= seq_lseek, //同样是系统默认的
	.release	= single_release, //因为在proc_open的时候使用的是single_open(),所以这里必须使用single_release.
};
struct proc_dir_entry *entry = NULL;
static int test_proc_create(void)
{
	entry = proc_create("read_one_time", S_IRUGO, NULL, &test_proc_fops);//将对应proc文件read_one_time和test_proc_fops捆绑
	if (!entry)
		return -ENOMEM;

	return 0;
}
#endif

int hello_init(void)
{
	if(test_proc_create())
		printk(KERN_ALERT "proc create failed\n");
	printk(KERN_ALERT "proc create success\n");
	return 0;
}

void hello_exit(void)
{
	proc_remove(entry);
	printk(KERN_ALERT "Hello Exit!\n");
}

module_init(hello_init); 
module_exit(hello_exit); 
MODULE_LICENSE("GPL"); //如果没这个,加载模块时,它会提示找不到若干symbol。

2.proc文件创建效果图


3.使用cat命令查看


4.使用vim查看


总结:上面可以看出,不管你是使用哪一种读方式,最终都会调用static int test_proc_show()函数,不管过程怎么样,结果都是一样的


Linux伪文件系统proc Linux伪文件proc 阅读详情

相关推荐

​ 详解Linux内核通信-proc文件系统

使用 /proc 文件系统来访问 Linux 内核的内容,这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口:/proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。本文对 /proc 虚拟文件系统进行了介绍,并展示了它的用法。最初开发 /proc 文件系统是为了提供有关系统中进程的信息。

m0_74282605的博客 1514

【linux API分析】proc_create() 及初识proc

proc文件的创建

weixin_42963900的博客 2767

linux 在proc文件系统下创建文件

本例主要涉及如何在proc下创建文件 ##### 基于linux3.10 ##### 例1: /*=============================================================== * Copyright (C) 2015 All rights reserved. * * File :proc.c * Author

前行 4545

proc_create的使用方法

其中第三个参数,也就是single_open的data参数,内核中有些地方传入的NULL,有些地方传入的inode->i_private,也有传入其他值的。发现show函数的第一个参数为seq_file类型,在show函数中,可以将seq_file的private成员转换成对应的类型进行使用。也就是要在哪个文件夹之下创建新文件夹,需要将那个文件夹的proc_dir_entry传入。根据以上这段说明,在mytest_proc_open函数中,只需要调用single_open函数,并传入一个show函数即可。.

szembed的博客 1632

通过proc接口调试内核代码

内核代码调试

qq_38158479的博客 972

Linux seq命令的使用方法

主要介绍了Linux seq命令的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

【Linux】proc文件系统

proc文件系统-----在报告系统内核中的信息方面是非常好用的。

希希雾里 5022

vscode中创建vue快捷键

1.安装Vetur插件(扩展里面直接搜) 2.vscode 界面里面左上角选则 文件=> 首选项=> 用户代码片段=>新建全局代码片段=>在输入框中新建名称为vue.json 3.删除里面的注释,当然你也可以留着,把下面的代码粘贴进去! { // Place your 全局 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and // descri

Leon_940002463的博客 3207

Linux驱动基础 | proc文件系统

需求:尝试自己写一个内核模块,在/proc中创建名为"test"的目录,在"test"目录下创建两个节点,分别是"read"和"write"节点。proc 文件系统的挂载点是 /proc,它可以获取进程的有用信息、系统的有用信息等,可以查看具体某个进程号的相关信息,也可以查看系统的信息,比如CPU,内存信息,中断信息,设备映射状态信息,内核日志信息等。proc 文件系统提供了一些内核中各个子系统的信息,所以procfs中的文件通常是只读的,只在一些特殊情况下允许写入,例如禁用nmi_watchdog。

weixin_44458100的博客 1474

告别‘打架’的检测头:手把手教你用PyTorch实现YOLOv11解耦头(附完整代码)

本文详细解析了YOLOv11解耦检测头的创新设计与PyTorch实现,通过解耦分类和回归任务,显著提升目标检测性能。文章包含完整的代码实现、架构设计解析及工程调优技巧,帮助开发者深入理解并应用这一先进技术。

weixin_29031057的博客 301

【Linux】proc 文件系统详解

proc文件系统位于文件系统的根目录下,通常表现为/proc目录。这个目录包含了许多子目录和文件,它们代表了系统中的各种资源和状态信息。例如,每个正在运行的进程都会在/proc中有一个对应的子目录,其名称为该进程的 PID(进程标识符)。除了系统自带的/proc文件之外,内核开发人员也可以创建自己的/proc文件来提供额外的功能。要创建一个自定义的/proc文件,通常需要注册一个proc文件系统入口点,并实现相应的读写函数。以下是一个简单的示例,展示如何在内核模块中创建一个自定义的/proc/proc。

极客代码 2463

SQL Server2008详细安装步骤(超详细步骤)

https://pan.baidu.com/s/1yvolqfU-AbiuGrIzblA7pA 提取码:lzw81.下载好安装包后解压到除C盘以外的磁盘,避免系统卡顿2.使用管理员身份打开安装程序注意:使用管理员身份打开时,此时如果显示以下画面属于正常现象,下载安装即可。因为.net现在有很多软件都需要,包括SQLSERVER2008,它里面有visual studio都要有net,电脑系统没有的话安装一下好了。3.选择全新安装或向现有安装添加新功能4.点击确定5.出现以下画面之后,输入产品密钥即可(密钥在

m0_67402774的博客 4万+

linux proc文件系统详解

linux proc文件系统详解 文章目录linux proc文件系统详解PIDattrcurrentexecfscreatekeycreateprevsockcreateautogroupauxvcgroupclear_refscmdlinecommcoredump_filtercpusetcwd -> /environexefdfdinfogid_mapiolimitsloginuidmap_filesmapsmemmountinfomountsmountstatsnetnsnuma_mapsoo

fly0512的博客 7524

YOLOv11改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv11目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 3601

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

m0_46364958的博客 4345

linux proc 文件系统

proc文件系统源码分析

weird213的博客 1493

激光打标轴坐标计算分析

‌:基于坐标差的平方和开方运算,勾股定理将几何关系转化为代数计算,从而实现了从坐标到距离的精确转换‌12。直角三角形的应用从上图可以看到A,B,P三个点连起来就是一个直角三角形了。用勾股定理计算距离 C#有相关的方法直接传参数就可以了。很方便。

StevenChen的博客 312

Linux内核模块开发:在Linux Proc文件系统中创建文件

Linux内核模块开发:在Linux Proc文件系统中创建文件

ych4444的博客 4796

【Bug已解决】openclaw max turns reached / Tool calls exceeded limit — OpenClaw 最大轮次超限解决方案

OpenClaw 在执行过程中达到最大轮次限制任务未完成,本质是 --max-turns 设置过小或任务过于复杂。文中给出增加轮次、--continue 继续、分步执行等完整方案。

一键难忘的博客 5505

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入了解linux proc文件系统

Linux 操作系统中的/proc文件系统是一个特殊的虚拟文件系统,它提供了一种机制来访问内核的数据结构。它包含了系统运行时的信息,如系统内存使用情况、进程信息、已加载的模块等。/proc文件系统是一个只读的文件系统,它在内存中而不是在磁盘上,这意味着访问/proc文件系统的速度非常快。

haimin0371的专栏 939

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux的proc文件系统揭秘

linux的proc文件系统(procfs)的全称是process information pseudo-filesystem(进程信息伪文件系统)。它是一个特殊的文件系统,通常在系统启动时被自动挂载到/proc目录,以一个多级的目录/文件的方式显示关于进程和其它的系统信息。 proc文件系统中的绝大多数文件是只读的,但也有一些是可写的(例如/proc/sys)。 proc文件系统提供了从用户空间...

sinat_26058371的博客 2987

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Linux】proc_create的使用方法

proc_create的使用方法 proc文件系统是个有用的东东。 创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互。 proc虚拟文件是如何创建的呢? 先看看比较简单的,创建proc文件夹。 调用以下函数,即可实现proc文件夹的创建: struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_...

迟子涵925的博客 5556

proc文件系统:1.proc文件系统简介

// 内核 #include <linux/kernel.h> // 模块 #include <linux/module.h> // 使用mutex #include <linux/mutex.h> // proc_fs定义 #include <linux/proc_fs.h> // seq_file接口 #include <linux/seq...

sandalphon4869的博客 1914

【Linux】/proc文件系统

简单介绍了/proc文件系统

pannlz的博客 1119

探究linux系统之proc文件系统详解

proc文件系统详解

低调,谦虚,自律,反思,成长,保持热爱,奔赴梦想 2242
上一篇: linux下devicetree中惯用的of函数
下一篇: linux proc文件系统-属性文件使用之读写
armwind
博客等级 码龄12年 406粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值