sysfs文件系统中,普通文件对应于kobject中的属性。用sysfs_create_file(),参数如下:

sysfs_create_file(struct kobject * kobj, const struct attribute * attr)

传给它的参数是kobj和attr,其中,kobject对应的是文件夹,attribute对应的是该文件夹下的文件。

include/linux/sysfs.h

static inline int __must_check sysfs_create_file(struct kobject *kobj,const struct attribute *attr)
{return sysfs_create_file_ns(kobj, attr, NULL);
}

它直接调用sysfs_create_file_ns()

fs/sysfs/file.c

int sysfs_create_file_ns(struct kobject *kobj, const struct attribute *attr,const void *ns)
{BUG_ON(!kobj || !kobj->sd || !attr);return sysfs_add_file_mode_ns(kobj->sd, attr, false, attr->mode, ns);
}

fs/sysfs/file.c

int sysfs_add_file_mode_ns(struct kernfs_node *parent,const struct attribute *attr, bool is_bin,umode_t mode, const void *ns)
{struct lock_class_key *key = NULL;const struct kernfs_ops *ops;struct kernfs_node *kn;loff_t size;if (!is_bin) {struct kobject *kobj = parent->priv;const struct sysfs_ops *sysfs_ops = kobj->ktype->sysfs_ops;/* every kobject with an attribute needs a ktype assigned */if (WARN(!sysfs_ops, KERN_ERR"missing sysfs attribute operations for kobject: %s\n",kobject_name(kobj)))return -EINVAL;if (sysfs_ops->show && sysfs_ops->store)ops = &sysfs_file_kfops_rw;else if (sysfs_ops->show)ops = &sysfs_file_kfops_ro;else if (sysfs_ops->store)ops = &sysfs_file_kfops_wo;elseops = &sysfs_file_kfops_empty;size = PAGE_SIZE;} else {struct bin_attribute *battr = (void *)attr;if (battr->mmap)ops = &sysfs_bin_kfops_mmap;else if (battr->read && battr->write)ops = &sysfs_bin_kfops_rw;else if (battr->read)ops = &sysfs_bin_kfops_ro;else if (battr->write)ops = &sysfs_bin_kfops_wo;elseops = &sysfs_file_kfops_empty;size = battr->size;}#ifdef CONFIG_DEBUG_LOCK_ALLOCif (!attr->ignore_lockdep)key = attr->key ?: (struct lock_class_key *)&attr->skey;
#endifkn = __kernfs_create_file(parent, attr->name, mode, size, ops,(void *)attr, ns, true, key);if (IS_ERR(kn)) {if (PTR_ERR(kn) == -EEXIST)sysfs_warn_dup(parent, attr->name);return PTR_ERR(kn);}return 0;
}

fs/kernfs/file.c

struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,const char *name,umode_t mode, loff_t size,const struct kernfs_ops *ops,void *priv, const void *ns,bool name_is_static,struct lock_class_key *key)
{struct kernfs_node *kn;unsigned flags;int rc;flags = KERNFS_FILE;if (name_is_static)flags |= KERNFS_STATIC_NAME;kn = kernfs_new_node(parent, name, (mode & S_IALLUGO) | S_IFREG, flags);if (!kn)return ERR_PTR(-ENOMEM);kn->attr.ops = ops;kn->attr.size = size;kn->ns = ns;kn->priv = priv;#ifdef CONFIG_DEBUG_LOCK_ALLOCif (key) {lockdep_init_map(&kn->dep_map, "s_active", key, 0);kn->flags |= KERNFS_LOCKDEP;}
#endif/** kn->attr.ops is accesible only while holding active ref.  We* need to know whether some ops are implemented outside active* ref.  Cache their existence in flags.*/if (ops->seq_show)kn->flags |= KERNFS_HAS_SEQ_SHOW;if (ops->mmap)kn->flags |= KERNFS_HAS_MMAP;rc = kernfs_add_one(kn);if (rc) {kernfs_put(kn);return ERR_PTR(rc);}return kn;
}

sysfs_create_file()仅仅是调用了kernfs_new_node()创建了一个kernfs_node结构。

Linux那些事儿之我是Sysfs(11)sysfs 创建普通文件相关推荐

  1. Linux系统USB驱动目录,Linux那些事儿之我是USB 目录

    目录 第1篇  Linux那些事儿之我是USB Core 1.引子 2 2.它从哪里来 2 3.PK 3 4.漫漫辛酸路 3 5.我型我秀 4 6.我是一棵树 5 7.我是谁 9 8.好戏开始了 11 ...

  2. Linux设备之我是usb,linux那些事儿之我是usb

    linux那些事儿之我是usb,复旦大学教授肖林甫先生给学生们解说的linux操作系统的一些硬件驱动开发的事儿. 内核说明: 我是U盘 说的是2.6.10的内核 我是Sysfs 说的是2.6.10的内 ...

  3. 读书笔记《Linux那些事儿之我是USB》

    第一篇:Linux那些事儿之我是USB Core USB诞生于inel 产生是为了解决前期计算机并口串口的问题,实现一种解决速度,扩展性,易用性的通信方式. 速度:usb2.0高速模式,480MB/s ...

  4. linux 那些事儿之我是 u 盘,《Linux那些事儿之我是USB》.PDF

    <Linux 那些事儿之我是 USB> 作者:华清远见 第 1 章 Linux 那些事儿之我是 USB Core 专业始于专注 卓识源于远见 1 .引子 老夫子们痛心疾首地总结说,现代青年 ...

  5. Linux那些事儿之我是Hub(9)While You Were Sleeping(二)

    老实说,从函数一个开始的598行直到627行都没有什么可说的.其中需要一提的是,606行,调用usb_buffer_alloc()申请内存,赋给hub->buffer.614行,调用kmallo ...

  6. 《Linux那些事儿之我是USB》我是U盘(1)小城故事

    这个故事中使用的是2.6.22的内核代码.在Linux内核代码目录中,所有与设备驱动程序有关的代码都在drivers/目录下面,在这个目录中用ls命令可以看到很多子目录: lfg1:/usr/src/ ...

  7. 《Linux那些事儿之我是USB》我是U盘(4)想到达明天现在就要启程

    既然知道了编写模块的方法,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难. 真的,我没说假话,写驱动不是什么难事,你完全可以很自信地说,你已经可以写 设备驱动 ...

  8. Linux那些事儿之我是Sysfs(3)设备模型上层容器

    §1 bus 系统中总线由struct bus_type描述,定义为: include/linux/device.h struct bus_type { const char *name;总线类型的名 ...

  9. linux lddbus设备,Linux那些事儿之我是Sysfs(4)举例一lddbus | 技术部落

    接下来我们从例子着手 localhost:/home/XX/examples/lddbus#insmod lddbus.ko 此时再看/sys/bus/ 这时就多了一个文件夹ldd.里面的文件构成是这 ...

最新文章

  1. nacos 配置不会动态刷新_Alibaba之Nacos详解
  2. dw项目符号空心圆怎么设置_项目规范配置之editorconfigamp;prettier
  3. scipy.ndimage.zoom上采样与下采样
  4. MySql的连接查询
  5. 教师节,老师们最大的愿望竟然是。。 | 今日最佳
  6. USACO2.4のP1519-穿越栅栏(Overfencing)【bfs】
  7. 教你怎么蹭网实现和dualwan双倍网速上网
  8. 项目方说性能达到百万TPS,如何测试它的可信度?
  9. a span做成按钮样式不选中文字
  10. 每日 30 秒 ⏱ 字符编码排雷录
  11. C#之判断Mysql数据库是否存在
  12. Android成长日记-Activity
  13. 高通QFIL刷机指南
  14. 速读训练软件和速读资料
  15. 基于QT框架的离线词典应用程序
  16. CSAPP第五章家庭作业(原书第二版)
  17. tableview中cell折叠的功能
  18. TMS Sphinx crack
  19. mysql获取当前时间是一年的第多少天
  20. 正方形和三角形面积C语言,探讨正方形中的三角形动态面积

热门文章

  1. C++ while 循环与 do...while 循环
  2. debug.keystore not found for signing config 'debug'.
  3. 阮一峰老师的ES6入门:async 函数
  4. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横
  5. Python学习笔记3——三大结构:顺序,分支,循环3
  6. 百度地图JavaScript API自定义覆盖物、自定义信息窗口增删时的显示问题
  7. 【转】C/C++中的日期和时间
  8. C语言程序设计 细节总结(第8章 指针)
  9. ORB_SLAM2代码阅读(2)——tracking线程
  10. autodesk许可证服务器,Autodesk软件工作流介绍(十)——配置网络许可服务器的步骤...