proc系统文件及编程

使用proc_create创建proc文件 下面这个例子是使用seq_file接口实现可读写proc文件的例子,适用于3.10以后的内核,这和之前创建proc文件的函数实现上有很大差别,3.10以前的内核调用create_proc_entry,3.10以后的内核调用proc_create。 proc.c /************************* * 使用seq_file接口实现可读写的proc文件 * 功能同proc_t 阅读详情

1 proc 简介

       1)/proc

              Linux内核提供的一种通过/proc系统文件,可在运行时访问内核内部数据结构、改变内核设置机制。

              Proc是一种伪文件系统,只在内存中存在,不占用外村空间。以文件系统访问形式向外提供接口。 

2)proc_dir_entry 结构             

       structproc_dir_entry {

              ….

       void*data;

       read_proc_t *read_proc;

       write_proc_t *write_proc;

       structlist_head pde_openers; /* who did->open, but not ->release */

};

说明:该结构保存有文件属性等内容,管理proc文件,还有两个读/写函数指针,需要手动设置。其原型为:

       typedef    int (read_proc_t)(char *page, char **start,off_t off,

                       int count, int *eof, void *data);

typedef    int(write_proc_t)(struct file *file, const char __user *buffer,

                        unsigned long count, void *data);


2 proc驱动相关函数

       1)创建目录

              externstruct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,

                                          structproc_dir_entry *parent);      

2)创建文件

              staticinline struct proc_dir_entry *create_proc_read_entry(const char *name,

                                                        mode_tmode, struct proc_dir_entry *base,

                                                        read_proc_t*read_proc, void * data) 

       3)读写文件

       typedef    int(read_proc_t)(char *page, char **start, off_t off,

                       int count, int *eof, void *data);

          page:用户接收数据空间的首地址;

          offset:接收数据空间的相对于首地址的偏移量(单位:字节);

          count:请求读的数据长度

          eof:反馈是否已到所读数据的末尾位置

        data:用户传入的数据

             

typedef    int(write_proc_t)(struct file *file, const char __user *buffer,

                        unsigned long count, void *data);

              file:

                     待写的文件指针

              buffer:

                     用户空间首地址, __user:用户态的地址空间

              count:

                     申请写操作的数据长度

              data:

                     额外的参数传入,扩展用   

 

       4)remove_proc_entry(flag, dir);

              参数:

                     Flag读写权限

                     Dir 为删除的目录

       5)内核态与用户态的数据交换

              不能用用户态的: memcpy, strcpy等

              拷贝到用户空间

              copy_to_user(void__user *to, const void* from, unsigned long n);

              从用户空间读入

              copy_from_user(void*to,void __user *from, unsigned long n);

 

              注:返回值为未被复制的字节数


3 应用实例



static struct proc_dir_entry *prwd_dir=NULL,*prwd_rdonly=NULL,
                            *prwd_rdwr=NULL;
//proc_dir_entry类型用于指代proc文件和proc目录
static char sbufRO[100]="A test string for readonly!\n";
static char sbufRW[100]="";//用于存用户所写数据

static int prwd_rdonly_read(char *page,char **start,off_t offset,int count,int *eof,void *data){
  sprintf(page,"%s",sbufRO); *eof=1; return strlen(sbufRO);
}
//可读可读文件的读服务接口,参数参考上文
static int prwd_rdwr_read(char *page,char **start,off_t offset,int count,int *eof,void *data){
  int len=strlen(sbufRW);
  if(len<=offset){
     printk("No data for reading in sbufRW!\n");
     return 0;//0没有数据可读;-1表示不允许读;>0表示读到的数据总长度
  } 
  if(len-offset<count)count=len-offset;
  memcpy(page+offset,sbufRW+offset,count);
  //offset有值,则表明之前的数据已读,只要eof不为1,系统就会重调调用本读服务接口函数
  //注意要加上offset,不然会覆盖用户接收数据的空间里已接收到的数据
  if(len<=offset+count)*eof=1;
  return offset+count;//总长度
}

static int prwd_rdwr_write(struct file* filep,const char __user *buffer,unsigned long count,void *data){
  unsigned long cnt=count;
  if(cnt>=sizeof(sbufRW))cnt=sizeof(sbufRW)-1;//留一个'\0'空间
  if(copy_from_user(sbufRW,buffer,cnt)){
     printk("Failure to copy all data from user space!\n");
     return -1;
  }
  
  sbufRW[cnt]='\0';
  return cnt;
}
static int __init func_init(void){
   printk(K "Entry %s!\n",__FUNCTION__);
   prwd_dir=proc_mkdir("proc_rw",NULL);
   //创建proc目录,原型:proc_mkdir(待建目录名,上层已存在的目录路径)<--NULL表示默认的"/proc"
   //proc目录不需要专门指写读/写操作函数<--跟普通目录差不多
   if(!prwd_dir){
      printk(K "Can not create dir:/proc/proc_rw!\n");
      goto failure_create_dir;
   }
   printk(K "Success to create dir:/proc/proc_rw!\n");
   
   prwd_rdonly=create_proc_read_entry("rdonly",0400,prwd_dir,prwd_rdonly_read,NULL);
   //创建proc只读文件,原型:create_proc_read_entry(待建文件名,读写权限,上层目录,读服务接口函数名,数据接口<将被读出的数据指针>)
   if(!prwd_rdonly){
      printk(K "Can not create dir:/proc/proc_rw/rdonly!\n");
      goto failure_create_file_rdonly;
   }
   printk(K "Success to create dir:/proc/proc_rw/rdonly!\n");
   
   prwd_rdwr=create_proc_entry("rdwr",0666,prwd_dir);
   //创建可读写的proc文件,原型:create_proc_entry(待建文件名,读写权限,上层目录)
   if(!prwd_rdwr){
      printk(K "Can not create dir:/proc/proc_rw/rdwr!\n");
      goto failure_create_file_rdwr;
   }
   printk(K "Success to create dir:/proc/proc_rw/rdwr!\n");
   prwd_rdwr->read_proc=prwd_rdwr_read;
   prwd_rdwr->write_proc=prwd_rdwr_write;
   //对于create_proc_entry来说,没有专门参数用于绑定读/写服务接口函数<--需要通过所返回的PROC文件对象的read_proc/write_proc函数指针成员来额外绑定
   return 0;//加载成功
failure_create_file_rdwr:    
   remove_proc_entry("rdwr",prwd_dir);
failure_create_file_rdonly:
   remove_proc_entry("rdonly",prwd_dir);  
failure_create_dir:
   remove_proc_entry("proc_rw",NULL);
   //删除proc文件/目录实体,原型:remove_proc_entry(待删文件或目录名,上层目录路径); 
   return -1;//加载失败
}
static void __exit func_exit(void){
   printk(K "Entry %s!\n",__FUNCTION__);
   remove_proc_entry("rdwr",prwd_dir);
   remove_proc_entry("rdonly",prwd_dir);  
   remove_proc_entry("proc_rw",NULL);  
}
module_init(func_init);
module_exit(func_exit);


Oracle ProC/C++编程源代码及应用实践 本文还有配套的精品资源,点击获取 简介:Oracle ProC/C++编程是一种将C++语言与Oracle数据库结合的技术,适用于编写数据库操作相关的存储过程、函数等。Oracle 11g版本对ProC/C++的支持加强,允许开发者利用C++的性能优势。本课程内容包括ProC语法、绑定变量、游标操作、异常处理、类型映射、预编译和编译过程、动态链接库生成、性能优化,以及Ora... 阅读详情

相关推荐

proc编程的入门资料

proc编程的基础资料,里面从最基础的内容说起,并附有代码。

开发中proc文件系统的简单使用

在Linux系统中, “/proc”文件系统十分有用, 它被内核用于向用户导出信息。“/proc”文件系统是一个虚拟文件系统, 通过它可以在Linux内核空间和用户空间之间进行通信。在/proc文件系统中, 我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段, 与普通文件不同的是, 这些虚拟文件的内容都是动态创建的。“/proc”下的绝大多数文件是只读的, 以显示内核信息为主。

weixin_52849254的博客 1709

linux proc 文件系统 编程手册

linux proc 文件系统 编程手册,对初学者 很有用

PROC编程基础

<br /> PROC是ORACLE数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具<br />体的例子,介绍PROC编程的一些经验及应注意的地方。<br /><br />       例子程序:<br />       #include <stdio.h><br />       #include <string.h><br />       #include <stdlib.h><br />       #include <sqlda.h><br />       #include <sqlc

dingweili的专栏 6265

RTT(RT-Thread)串口设备(RTT保姆级教程)

本章主要介绍串口设备在RT-Thread操作系统中应用层如何使用。关于串口设备的使用,我们只需要在应用层找到串口设备,然后去初始化,初始化完成以后就可以读写串口设备了。操作的方法在应用层,驱动是不需要我们去完成的,驱动已经在操作系统中提供了。

qq_25218501的博客 1万+

一、两电平IGBT整流器

电压源换流器(Voltage source converter,VSC)连接交流主网和直流电网,起到交直流网络连接、功率输送和电能变换的作用。采用电压控制手段可维持直流电压的稳定;或采用功率控制手段保证系统功率输出达到预期。VSC的三相电压平衡方程如式(1)所示:式中,igx和ugx分别表示主网三相电流与电压(x=a,b,c);ucx表示换流器VSC 交流输出电压;Rg表示交流主网等效电阻;Lg表示交流主网等效电感。

TUCHACHINA的博客 4159

Proc程序设计-

在C/C++语言中嵌入SQL语句而开发出的应用程序称为Pro*C/C++程序。–在命令行输入不带选项的proc命令就可以列出所有选项以及当前默认值。–在通用编程语言中使用的SQL称为嵌入式SQL;–在SQL标准中定义了多种语言的嵌入式SQL。指示proc去哪里找#include中包含的头文件。开发之前先写一个适合proc使用的makefile。代码对 Oracle 或 ANSI 规则的顺应性。–完成pc源程序到c/c++源程序的转换。/*行数据,输出描述区*/–proc 选项=?/*取得选择列表的个数*/

z6699520的博客 426

从逻辑门到存储阵列:NAND与NOR闪存命名与结构原理详解

在数字电路与半导体存储器领域,逻辑门是构建一切复杂功能的基础单元,其输入输出关系定义了计算与存储的基本原理。与非门(NAND)和或非门(NOR)作为通用逻辑门,其真值表和行为模式深刻影响了芯片设计。基于这些原理,现代闪存技术发展出了两种核心架构:NAND Flash和NOR Flash。这两种闪存的命名直接源于其内部存储单元阵列的连接方式,分别模拟了与非门和或非门的逻辑关系。这种结构差异决定了它们根本的技术价值:NOR Flash采用并联结构,支持快速随机读取,适用于代码存储与原地执行(XiP);而NAND

weixin_33377602的博客 339

proc 编程

proc编程    与sysfs虚拟文件系统相比,proc的使用没有sysfs那么组织严谨,更加随意,因此在内核模块中用proc文件系统与用户空间进行信息交互还是很方便的。      在内核模块中使用proc,需要包含头文件      其中常用的函数包括: 创建一个文件:      struct proc_dir_entry *create_proc_entry(

Sh@*de可以 924

从SSD到UFS:3分钟搞懂存储技术进化史(含最新协议对比)

本文梳理了从SSD到UFS的存储技术演进历程,重点解析了eMMC与UFS在架构上的核心差异。UFS凭借高速串行全双工接口,实现了性能与能效的飞跃。文章还对比了最新的UFS 4.0与PCIe 5.0 SSD协议,并探讨了3D NAND、SLC缓存等底层技术,揭示了移动与PC存储技术融合的未来趋势。

weixin_29294597的博客 279

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

​ 1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18,而数据库中原始数据如下,并没有到下午5点,这就导致了FlinkCDC读出来的时间和数据库中实际的时间不一致的情况,与数据库对比可以发现,这里的时间戳与数据库时间刚好相差了 8 个小时,在实际生产中这种情况是不

一杯咖啡半杯糖的博客 3854

linux 内核编程之proc虚拟文件系统

【版权声明:转载请保留出处:blog.youkuaiyun.com/gentleliu。邮箱:shallnew*163.com】 在 Linux 系统中,/proc 文件系统十分有用,它被用于内核向用户导出信息。/proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux 内核空间和用户空间之间进行通信。在/proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信

程序猿的挨踢人生 4155

家里摄像头录像存 NAS,空间爆满了怎么办?一招实现设定容量自动清理实现循环存储!

📷 家用摄像头录像久了会撑爆 NAS 吗?别担心,这篇文章教如何实现自动清理录像,释放 NAS 空间,避免爆盘🧹

XiaoqiangClub的博客 1882

/proc读取

读取/proc下文件数据方法有两种:       1.使用read_proc,此方法一次最多只能返回1 PAGE(页)内页大小的数据,不适合大数据量交换             创建:使用 create_proc_read_entry(NAEM, MASK, MODE, read_proc, void *for_read_proc_data);                     前面3

LBO4031的专栏 1050

LLaMA Factory添加新模型template的实战解析

本文主要介绍了LLaMA Factory添加新模型template的实战解析,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战解析 2.1 检查代码 2.2 修改代码

herosunly的博客 19万+

如何在 Linux 上安装 RTX 5090 / 5080 /5070 Ti / 5070 驱动程序 — 详细指南

Linux 上的 NVIDIA 5090 是 AI、游戏和渲染的强大引擎,但需要耐心。如果稳定性是首要考虑因素,请坚持使用开源驱动程序,并关注 NVIDIA 论坛以获取未来更新。

iCloudEnd的博客 6912

驱动程序调试方法之printk——自制proc文件(一)

首先我们需要弄清楚proc机制,来看看fs/proc/proc_misc.c这个文件,从入口函数开始看: proc_misc_init(void)         #ifdef CONFIG_PRINTK { struct proc_dir_entry *entry; entry = create_proc_entry("kmsg", S_IRUSR, &amp;proc_root...

weixin_34064653的博客 105

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

oracle proc编程 fetch,ORACLE数据库PROC编程的一些经验

ORACLE数据库PROC编程的一些经验第 1 章概述PROC是Oracle数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具体的例子,介绍PROC编程的一些经验及应注重的地方。例子程序:EXEC SQL INCLUDE sqlca;/*RELEASE_CURSOR=YES使PROC在执行完后释放与嵌入SQL有关资源*/EXEC ORACLE OPTION (RELEASE_CURSOR ...

weixin_36185512的博客 274

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

达梦数据库PROC编程案例

大纲一、PROC简介二、PROC使用1.proC环境准备2.proC代码示例建表查表插入数据更新数据删表 一、PROC简介 二、PROC使用 1.proC环境准备 2.proC代码示例 建表 查表 插入数据 更新数据 删表

qq_33965675的博客 1223

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

oracle proc编程 fetch,ORACLE数据库PROC编程经验介绍

ORACLE数据库PROC编程经验介绍--------------------------------------------------------------------------------2002-3-1  作者:风沙 【类别:编程语言及工具】PROC是ORACLE数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具体的例子,介绍PROC编程的一些经验及应注意的地方。例子程序:...

weixin_30608641的博客 451

汇编中的proc指令

proc是子程序定义伪指令, far是该子程序的属性,决定调用程序和子程序是否在同一代码段 如下:为子程序定义及说明, 子程序名 PROC NEAR ( 或 FAR ) xxxxxx具体代码 ret 子程序名 ENDP 子程序名为符合语法的标识符 NEAR属性(段内近调用): 调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用; FAR属性(段间远调用): 调用程序和子程序不在同一代...

迪迦 • 奥特曼 2万+

介绍PROC编程的一些经验

PROC是ORACLE数据库提供的编程接口之一,其应用十分的广泛,本文通过一个具体的例子,介绍PROC编程的一些经验及应注意的地方。 例子程序: #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; #include &lt;sqlda.h&gt; #include &l...

数据库天地 917

TCL 过程proc

文章目录pro的基本概念结构局部变量和全局变量:TCL中的特殊参数形式;没有任何参数的过程, 或者缺省参数可变个数的参数 本篇文章介绍的是proc这个概念,称之为过程,实现的效果相当于你创建了一个TCL的命令一样,非常类似于C语言中的函数。 pro的基本概念结构 proc add {x y} {expr $x+ $y} 如上面code所示, add作为的是这个过程的名字,xy是过程的参数列表,参数之间要用空格隔开,接着用花括号{ } 代表过程体。proc从而生成了一个新的cmd,可以像cmd一样来调用他。

ciscomonkey的博客 9949

实现嵌入式sql的方法之proc编程

编写的proc程序的后缀是.pc,此时c/c++编译器是无法解析的,oracle公司根据通用标准做了一个proc预编译器,将.pc文件编译后会生成.c文件,后序操作就和c语言的编译运行是一样的了。 ...

一个小孩 1498

【proc】使用proc_create_data函数在proc下创建节点

前情提要: 移植代码的时候遇到create_proc_read_entry函数,新的内核里已经没有这个函数了,只能找对应的替换。 proc_create_data函数就是可以替换掉它,本文主要讲解下如何使用proc_create_data,以及相关的参数配置。 proc_create_data函数 函数定义在“linux/proc_fs.h”头文件中 extern struct proc_dir_entry *proc_create_data(const char *, umode_t,.

诸葛一帆丶的博客 1万+
下一篇: linux字符设备及其驱动编写简介
ilearncpp
博客等级 码龄17年 24粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值