proc文件操作

        proc文件系统是一种伪文件系统,这种文件系统不存在于磁盘上,只存在于内存中,只有内核运行时才会动态生成里面的内容。这个文件系统通常挂载在/proc目录下,是内核向开发者到处信息的常用方式。

        在系统中,有的这种文件也可写,这种在不重新编译内核以及不重启系统的情况下可以改变内核的行为。下面我们用一个实例来演示proc接口的使用

/*************************************************************************
	> File Name: vser.c
	> Author: longway.bai
	> Mail: 953821672@qq.com
	> Created Time: 2021年12月11日 星期六 19时12分04秒
	> cat /proc/vser/info
 ************************************************************************/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/kfifo.h>

#include <linux/ioctl.h>
#include <linux/uaccess.h>
#include <linux/seq_file.h> //proc相关头文件
#include <linux/proc_fs.h>

#define VSER_MAJOR 256
#define VSER_MINOR 0
#define VSER_DEV_CNT 1
#define VSER_DEV_NAME "vser"

struct option {
    unsigned int datab;
    unsigned int parity;
    unsigned int stopb;
};

/* 在vser结构体中添加两个struct proc_dir_entry类型的结构指针成员,我们要现在/proc目录下建立一个vser目录
 * 再在vser目录下建立一个info文件*/
struct vser_dev {
    unsigned int baud;
    struct option opt;
    struct cdev cdev;
    struct proc_dir_entry *pdir; //创建的目录
    struct proc_dir_entry *pdat; //创建的文件
};

static struct vser_dev vsdev;

static int dat_show(struct seq_file *m, void *v)
{
    struct vser_dev *dev = m->private; //从私有数据中获得设备结构体地址,通过proc_create_data函数调用时(第五个参数)传递的

    seq_printf(m, "baudrate: %d\n", dev->baud);
    seq_printf(m, "frame format: %d%c%d\n", dev->opt.datab,\
                    dev->opt.parity == 0 ? 'N' : dev->opt.parity == 1 ? 'O':'E',\
                    dev->opt.stopb);

    return 0;
}

static int proc_open(struct inode *inode, struct file *file)
{
    /*proc_open调用single_open来辅助实现*/
	return single_open(file, dat_show, PDE_DATA(inode));
}

static struct file_operations proc_ops = {
    .owner = THIS_MODULE,
    .open = proc_open,
    .release = single_release,
    .read = seq_read,
    .llseek = seq_lseek,
							
};

static int __init vser_init(void)
{
    int ret;
    dev_t dev;

    dev = MKDEV(VSER_MAJOR, VSER_MINOR);
    ret = register_chrdev_region(dev, VSER_DEV_CNT, VSER_DEV_NAME);
    if(ret)
        goto reg_err;

    cdev_init(&vsdev.cdev, &proc_ops);
    vsdev.cdev.owner = THIS_MODULE;
    vsdev.baud = 115200;
    vsdev.opt.datab = 8;
    vsdev.opt.parity = 0;
    vsdev.opt.stopb = 1;

    ret = cdev_add(&vsdev.cdev, dev, VSER_DEV_CNT);
    if (ret)
		goto add_err;

    /*以下是创建proc文件*/
    vsdev.pdir = proc_mkdir("vser", NULL);//第一个参数表示目录的名字,第二个参数为NULL,表示在/proc目录下创建目录
    if (!vsdev.pdir)
        goto dir_err;

    /* 第一个参数表示创建文件的名字,第二个参数表示权限,第三个参数是目录的目录项指针
     * 第四个参数表示该文件的操作方法集合,第五个表示该文件的私有数据*/
    vsdev.pdat = proc_create_data("info", 0, vsdev.pdir, &proc_ops, &vsdev);
    if (!vsdev.pdat)
        goto dat_err;

    return 0;
dat_err:
    remove_proc_entry("vser", NULL);
dir_err:
    cdev_del(&vsdev.cdev);
add_err:
    unregister_chrdev_region(dev,VSER_DEV_CNT);

reg_err:
    return ret;

}

static void __exit vser_exit(void)
{
    dev_t dev;

    dev = MKDEV(VSER_MAJOR, VSER_MINOR);

    remove_proc_entry("info", vsdev.pdir);
    remove_proc_entry("vser", NULL);
    cdev_del(&vsdev.cdev);

    unregister_chrdev_region(dev,VSER_DEV_CNT);
					
}

module_init(vser_init);
module_exit(vser_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("longway<longway.bai@outlook.com>");
MODULE_DESCRIPTION("A simple module");
MODULE_ALIAS("virtual-serial");

驱动实现后,可以用以下命令来验证

#cat /proc/vser/info 
baudrate: 115200
frame format: 8N1

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统实验中的proc文件系统是一种特殊的文件系统,主要用于提供操作系统内核信息的访问和管理。在实现proc文件系统时,需要完成以下几个主要步骤。 首先,需要定义一个proc文件结构体,用于描述proc文件的属性和操作。这个结构体通常包含文件名、文件大小、文件访问权限等信息,以便操作系统能够对其进行正确的处理。 接下来,需要实现创建proc文件的函数。这个函数负责在内核中创建一个proc文件,并将文件结构体与之关联。在创建过程中,需要为proc文件分配一个唯一的文件名,并指定相应的访问权限。 然后,需要实现读取proc文件内容的函数。这个函数会在用户空间打开proc文件时被调用,并将proc文件的内容返回给用户。根据不同的需求,可以通过读取内核变量或调用相关系统调用来获取文件内容。 此外,还需要实现写入proc文件内容的函数。这个函数会在用户空间对proc文件进行写入时被调用,并将用户输入的内容写入到相应的内核变量或系统调用中。 最后,还需要实现删除proc文件的函数。这个函数会在用户空间关闭proc文件操作系统关闭时被调用,负责释放proc文件的相关资源。 总之,实现proc文件系统需要定义文件结构体、创建、读取、写入和删除文件的函数。通过这些功能,用户可以在用户空间访问和管理内核的信息,提供了一个方便的方式来查看和调试操作系统内部状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值