创建一个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.  A
module can define only the show() function, which should create all the
output that the virtual file will contain. The file's open() method then
calls:

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 data
value given to single_open() can be found in the private field of the
seq_file structure. When using single_open(), the programmer should use
single_release() instead of seq_release() in the file_operations structure
to 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;
} 通过读写mytest文件,即可实现对mytest_flag的控制。

PROC文件及文件夹创建相关推荐

  1. java file 操作之创建、删除文件及文件夹

    本文章向大家讲解java文件的基本操作,包括java创建文件和文件夹.java删除文件.java获取指定目录的全部文件.java判断指定路径是否为目录以及java搜索指定目录的全部内容等.请看下面实例 ...

  2. 用matlab判断文件是否存在_判断文件夹、文件是否存在、创建文件 c++ matlab

    Matlab: 1. exist判断当前目录是否存在指定文件夹 例子1 if ~exist('Figure') mkdir('Figure') % 若不存在,在当前目录中产生一个子目录'Figure' ...

  3. C#判断文件及文件夹是否存在并创建

    c# 应用知识汇集 2008-09-14 14:19:57 阅读564 评论0 字号:大中小 C#判断文件及文件夹是否存在并 创建 using System; using System.Data; u ...

  4. golang 文件 文件夹 创建 读取 移动 复制 写入 遍历

    目录 文件读取 创建 写入 移动 拷贝 删除 文件 创建文件夹 文件覆盖判断 遍历文件夹 权限 文件操作, 大体分为两部分: os库 : 文件\文件夹创建,读取,移动,复制 io库 : 文件内容的写入 ...

  5. php 自动创建文件,php:自动创建多级文件夹

    /** * 函数说明 * is_dir:判断给定文件名是否是一个目录,如果是返回ture,如果不是返回false * dirname:返回路径中的目录部分,本函数返回去掉文件名后的目录名.比如$pat ...

  6. [Xcode 实际操作]七、文件与数据-(2)创建文件夹

    目录:[Swift]Xcode实际操作 本文将演示如何创建文件夹. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 3 class ...

  7. K8S configmap详解:从文件创建、从文件夹创建及以volume、env环境变量的方式在pod中使用

    K8S configmap详解:从文件创建.从文件夹创建及以volume.env环境变量的方式在pod中使用 ConfigMap是用来存储配置文件的kubernetes资源对象,所有的配置内容都存储在 ...

  8. python创建模块文件夹_python文件、文件夹、压缩包处理模块-shutil模块

    shutil模块 高级的文件.文件夹.压缩包 处理模块 本节内容基本在linux下python交互环境实现 复制移动文件.文件夹 将文件内容拷贝到另一个文件中,可以部分内容 格式如下: ``` shu ...

  9. java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...

    java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...

  10. linux java 文件夹创建失败_Linux文件夹文件创建、删除

    Linux删除文件夹命令 linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可. 直接rm就可以了,不过要加两个参数-rf 即:r ...

最新文章

  1. SpringBoot文件上传异常之temporary upload location not valid
  2. 过程 oracle 写在哪里,Oracle怎么写存储过程? 在什么地方写以及怎么调用?最好给个Sample 急(2)...
  3. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(下)
  4. 对新手的忠告:拒绝创意,回归基础
  5. 在做自动化测试之前你需要知道的,转自:http://www.cnblogs.com/fnng/p/3653793.html
  6. SAP WebIDE destination的 discovery工作机制 -下拉菜单项是如何被填充的
  7. [剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]
  8. aws java mysql_java - AWS EC2 / MySql - spring boot无法从datasource确定jdbc url - 堆栈内存溢出...
  9. python支付系统_GitHub - zhuf/alipay_python: 支付宝 alipay python接口,支持担保交易,即时到帐和自动发货接口...
  10. 边缘检测后去除噪点_Street Lanes Finder - 检测自动驾驶汽车的车道
  11. 赚钱的过程,也是合作的过程
  12. Android将应用log信息保存文件
  13. 这可能是最好的RxJava 2.x 教程(完结版)
  14. 德标螺纹规格对照表_国标德标对照表
  15. abb机器人goto指令用法_ABB机器人的指令详细介绍!!!
  16. crmeb单商户4.4开目录结构 crmeb二开文档 crmeb二开目录结构
  17. 创造与魔法怎么自建服务器,创造与魔法如何建立部落 部落建造条件
  18. 刍议当代大学生恋爱观
  19. 字符串库函数(1)Strlen,strcpy,strcat,strcmp
  20. 这些旅游类短视频账号在快手涨粉的总结

热门文章

  1. Asp.Net随机中文汉字验证码
  2. python url拼接_简单一文教你如何用python爬虫爬取扇贝单词
  3. PHP微信公众开发笔记(一)
  4. JNI 本地方法注册
  5. Java IO源码目录
  6. WebSocket+HTML5实现在线聊天室
  7. Citrix为什么要兼容第三方服务器虚拟化平台
  8. R语言学习笔记(1)
  9. Hadoop核心组件
  10. ASP.NET MVC4 IN ACTION学习笔记-第六波[Ajax in ASP.NET MVC][3/3]