/proc文件系统下,创建文件和文件夹proc

您所在的位置:网站首页 sai未能创建下数据文件夹 /proc文件系统下,创建文件和文件夹proc

/proc文件系统下,创建文件和文件夹proc

2024-07-13 17:33| 来源: 网络整理| 查看: 265

Copy from:https://blog.csdn.net/njuitjf/article/details/16940865

 

 

proc_create的使用方法

proc文件系统是个有用的东东。创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互。proc虚拟文件是如何创建的呢?

先看看比较简单的,创建proc文件夹。调用以下函数,即可实现proc文件夹的创建:struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);name就是要创建的文件夹名称。parent是要创建节点的父节点。也就是要在哪个文件夹之下创建新文件夹,需要将那个文件夹的proc_dir_entry传入。如果是在/proc目录下创建文件夹,parent为NULL。例如:struct proc_dir_entry *mytest_dir = proc_mkdir("mytest", NULL);

然后来看看proc文件的创建。创建方法是调用以下函数:static inline struct proc_dir_entry *proc_create(const char *name, mode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops);name就是要创建的文件名。mode是文件的访问权限,以UGO的模式表示。parent与proc_mkdir中的parent类似。也是父文件夹的proc_dir_entry对象。proc_fops就是该文件的操作函数了。例如:struct proc_dir_entry *mytest_file = proc_create("mytest", 0x0644, mytest_dir, mytest_proc_fops);还有一种方式:struct proc_dir_entry *mytest_file = proc_create("mytest/mytest", 0x0644, NULL, mytest_proc_fops);如果文件夹名称和文件名定义为常量:#define MYTEST_PROC_DIR "mytest"#define MYTEST_PROC_FILE "mytest"第二种方式为:struct proc_dir_entry *mytest_file = proc_create(MYTEST_PROC_DIR"/"MYTEST_PROC_FILE, 0x0644, NULL, mytest_proc_fops);

接下来看看mytest_proc_fops的定义。static const struct file_operations mytest_proc_fops = { .open  = mytest_proc_open, .read  = seq_read, .write  = mytest_proc_write, .llseek  = seq_lseek, .release = single_release,};以seq_和single_为前缀的函数都是kernel中现成的。可以参考文档:Documentation\filesystems\seq_file.txt关于single_开头的函数,有以下说明:

The extra-simple version

For extremely simple virtual files, there is an even easier interface.  Amodule can define only the show() function, which should create all theoutput that the virtual file will contain. The file's open() method thencalls:

 int single_open(struct file *file,                 int (*show)(struct seq_file *m, void *p),                 void *data);

When output time comes, the show() function will be called once. The datavalue given to single_open() can be found in the private field of theseq_file structure. When using single_open(), the programmer should usesingle_release() instead of seq_release() in the file_operations structureto avoid a memory leak.

根据以上这段说明,在mytest_proc_open函数中,只需要调用single_open函数,并传入一个show函数即可。例如:static int mytest_proc_open(struct inode *inode, struct file *file){ return single_open(file, mytest_proc_show, inode->i_private);}其中第三个参数,也就是single_open的data参数,内核中有些地方传入的NULL,有些地方传入的inode->i_private,也有传入其他值的。来看看data在single_open函数中如何被使用的:  if (!res)   ((struct seq_file *)file->private_data)->private = data;这与前面的英文说明一致,data是seq_file结构体的private成员。那么data如何真正被使用的呢?发现show函数的第一个参数为seq_file类型,在show函数中,可以将seq_file的private成员转换成对应的类型进行使用。

下面来看看mytest_proc_show函数如何实现。传递给single_open的show函数指针,将在proc file输出时被调用。例如,cat /proc/mytest/mytest时,mytest_proc_show函数将会被调用。假设我们的mytest只是记录了一个标志,内核中会根据该标准执行不同的操作。来看看mytest_proc_show的实现:static int task_lifecycle_proc_show(struct seq_file *seq, void *v){ seq_puts(seq, mytest_flag ? "true\n" : "false\n");  return 0;        }

接下来再看看mytest_proc_write函数的实现。顾名思义,mytest_proc_write函数会在写mytest文件时被调用。功能就是记录写入数据到mytest文件。实现也不麻烦:static ssize_t task_lifecycle_proc_write(struct file *file, const char __user *buffer,        size_t count, loff_t *pos){ char mode;  if (count > 0) {  if (get_user(mode, buffer))   return -EFAULT;

   mytest_flag = (mode != '0'); }

 return count;}

至此,proc文件创建完毕。通过读写mytest文件,即可实现对mytest_flag的控制。更深层次的原理,即proc文件系统是如何实现的,就先不讨论了————————————————版权声明:本文为CSDN博主「njuitjf」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/njuitjf/article/details/16940865



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3