proc文件系统

 proc文件系统是一种用户态检查内核状态的机制,内容动态创建,存在内存中,在驱动中用于导出驱动的部分信息而存在。

一、

apm:高级电源管理信息

bus:总线及总线上的设备

devices:可用的设备信息

driver:已经启动的驱动程序

interrupts:中断信息

ioports:端口使用信息

version:内核版本

 

二、

proc文件的内核描述:

struct proc_dir_entry{

.......

read_proc_t *read_proc;//读回调函数

write_proc_t *write_proc;//写回调函数

.............

}

 

三、proc文件的创建

 

三一、直接创建操作

1.创建文件

struct proc_dir_entry *create_proc_entry(const char *name,mode_t mode, struct proc_dir_entry *parent)

name:文件名

mode:要创建的文件属性

parent:这个文件的父目录

struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode,struct proc_dir_entry *base,read_proc_t *read_proc,void *data);

 

2.创建目录

struct proc_dir_entry*   proc_mkdir(const char *name,struct proc_dir_entry *parent)

name:要创建的目录名

parent:这个目录的父目录

 

3. 删除文件、目录

void remove_proc_entry(const char *name ,struct proc_dir_entry *parent)

name:要删除的文件或目录名

parent:所在的父目录

 

4 读操作函数原型

int read_func(char *buffer,char **stat,off_t off,int count,int *peof,void *data)

buffer:返回给用户的信息写在buffer里,最大不超过PAGE_SIZE

stat:一般不使用

off:偏移量

count:用户要取得字节数

peof:读到文件尾时,需要把*peof置1

data:一般不使用

 5.写操作

int write_func(struct file *file,const char *buffer,unsigned long count,void *data)

file:该proc文件对应的file结构,一般忽略

buffer:待写得数据所在的位置

count:待写数据的大小

data:一般不使用

 

6 实现流程

(1)调用create_proc_entry创建一个struct proc_dir_entry

(2)对创建的struct proc_dir_entry进行赋值:read_proc,mode,owner,size,write_proc等。

 

7

例子1:

#define __KERNEL__
#define MODULE

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/proc_fs.h>
#define procfs_name "proctest"       //proc文件名

struct proc_dir_entry *Our_Proc_File;//内核描述

//读函数原型

int procfile_read(char *buffer,
 char **buffer_location,
 off_t offset,int buffer_length,int *eof,void *data) 
{
 int ret;
 ret = sprintf(buffer,"HelloWorld!\n");
 return ret;
}

int proc_init()
{
 Our_Proc_File =create_proc_entry(procfs_name,0644,NULL);//创建proc文件,NULL表示/proc文件下
 if(Our_Proc_File ==NULL)
 {
  remove_proc_entry(procfs_name,NULL);
  printk(KERN_ALERT"Error:Cound not initialize /proc/%s\n",procfs_name);
  return -ENOMEM;
 }

//给proc结构赋值
 Our_Proc_File->read_proc=procfile_read;
 Our_Proc_File->owner=THIS_MODULE;
 Our_Proc_File->mode=S_IFREG | S_IRUGO;
 Our_Proc_File->uid=0;
 Our_Proc_File->gid=0;
 Our_Proc_File->size=37;
 printk("/proc/%s created\n",procfs_name);
 return 0;
}
void proc_exit()
{
 remove_proc_entry(procfs_name,NULL);
 printk(KERN_INFO"/proc/%s removed \n",procfs_name);
 
}

module_init(proc_init);
module_exit(proc_exit);

 

Makefile文件:

VER=$(shell uname -r)
obj-m:=proc1.o

build:proc1
proc1:
 make -C /lib/modules/$(VER)/build M=$(CURDIR) modules
clean:
 make -C /lib/modules/$(VER)/build M=$(CURDIR) clean

 

 

#include <linux/module.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

static struct proc_dir_entry *mydir;
static struct proc_dir_entry *pfile;

static char msg[255];

static int myproc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
        int len = strlen(msg);

        if (off >= len)
                return 0;

        if (count > len - off)
                count = len - off;

        memcpy(page + off, msg + off, count);//同为内核空间
        return off + count;
}

static int myproc_write(struct file *file, const char __user *buffer, unsigned long count, void *data)
{
        unsigned long count2 = count;

        if (count2 >= sizeof(msg))
                count2 = sizeof(msg) - 1;

        if (copy_from_user(msg, buffer, count2))//注意从用户空间到内核空间拷贝数据
                return -EFAULT;

        msg[count2] = '\0';
        return count;
}

static int __init myproc_init(void)       //_init表示初始化代码段
{
        mydir = proc_mkdir("mydir", NULL);
        if (!mydir) {
                printk(KERN_ERR "Can't create /proc/mydir\n");
                return -1;
        }

        pfile = create_proc_entry("pool", 0666, mydir);
        if (!pfile) {
                printk(KERN_ERR "Can't create /proc/mydir/pool\n");
                remove_proc_entry("mydir", NULL);
                return -1;
        }

        pfile->read_proc = myproc_read;
        pfile->write_proc = myproc_write;

        return 0;
}

static void __exit myproc_exit(void)
{
        remove_proc_entry("pool", mydir);
        remove_proc_entry("mydir", NULL);
}

module_init(myproc_init);
module_exit(myproc_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LMJ");

 

Makefile文件:

VER=$(shell uname -r)
obj-m:=proc.o

build:proc
proc:
 make -C /lib/modules/$(VER)/build M=$(CURDIR) modules
clean:
 make -C /lib/modules/$(VER)/build M=$(CURDIR) clean

 

 三二、通过seq_file接口操作proc文件

 

1. 包含<linux/seq_file.h>头文件创建

       static struct seq_operations my_seq_ops{

                       .start = my_seq_start,

                       .next = my_seq_next,

                      .stop = my_seq_stop,

                      .show = my_seq_show,

                   };

       并实现my_seq_start、my_seq_nex、my_seq_stop、my_seq_show等函数

2. 实现一个文件的操作集结构

      static struct file_operation my_proc_ops{

              .ower = THIS_MODULE,

              .open = my_proc_open,//需要自己实现

              .read = seq_read,//直接调用系统函数

              .llseek = seq_lseek,//直接调用系统函数

              .release = seq_release

                };

       static int my_proc_open(struct inode *inode, struct file *file)

     {

               return seq_open(file,&my_seq_ops);

     }

 

3. 创建proc文件

     entry = create_proc_entry("my_seq",0,NULL);

      if(entry)

     {

           entry->proc_fops = &my_proc_ops;

      }

 

下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值