procfs 接口总结

创建proc子目录

接口

extern struct proc_dir_entry *proc_mkdir(const char *, struct proc_dir_entry *);

例如,创建目录/proc/irq

static struct proc_dir_entry *root_irq_dir;
void init_irq_proc(void)
{
    ...
    root_irq_dir = proc_mkdir("irq", NULL);
    if (!root_irq_dir)
        return;
    ...
}

在/proc/irq下创建其他目录
依然调用 proc_mkdir接口

void register_irq_proc(unsigned int irq, struct irq_desc *desc)
{
    static DEFINE_MUTEX(register_lock);
    void __maybe_unused *irqp = (void *)(unsigned long) irq;
    char name [MAX_NAMELEN];

    if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip))
        return;

    /*
     * irq directories are registered only when a handler is
     * added, not when the descriptor is created, so multiple
     * tasks might try to register at the same time.
     */
    mutex_lock(&register_lock);

    if (desc->dir)
        goto out_unlock;

    sprintf(name, "%d", irq);

    /* create /proc/irq/1234 */
    desc->dir = proc_mkdir(name, root_irq_dir);
    if (!desc->dir)
        goto out_unlock;
...
}

proc下创建文件

函数接口:

struct proc_dir_entry *proc_create(const char *name, umode_t mode,
                   struct proc_dir_entry *parent,
                   const struct file_operations *proc_fops)
{
    return proc_create_data(name, mode, parent, proc_fops, NULL);
}

例如:

static void register_default_affinity_proc(void)
{
#ifdef CONFIG_SMP
    proc_create("irq/default_smp_affinity", 0644, NULL,
            &default_affinity_proc_fops);
#endif
}

函数proc_create_data

struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
        struct proc_dir_entry *parent,
        const struct file_operations *proc_fops, void *data)

函数proc_create_single_data

struct proc_dir_entry *proc_create_single_data(const char *name, umode_t mode,
        struct proc_dir_entry *parent,
        int (*show)(struct seq_file *, void *), void *data)

proc_create_single_data 和 proc_create_data相比之下,proc_create_single_data 的参数是一个 show的函数指针
而proc_create_data的参数,是文件操作的结构体指针 file_operations *

实现方面:proc_create_single_data

struct proc_dir_entry *proc_create_single_data(const char *name, umode_t mode,
        struct proc_dir_entry *parent,
        int (*show)(struct seq_file *, void *), void *data)
{
    struct proc_dir_entry *p;

    p = proc_create_reg(name, mode, &parent, data);
    if (!p)
        return NULL;
    p->proc_fops = &proc_single_fops;  //使用了默认的fops,proc_single_fops
    p->single_show = show;            //初始化 single_show
    return proc_register(parent, p);
}

proc_single_fops 的默认内容如下:

static const struct file_operations proc_single_fops = {
    .open       = proc_single_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = single_release,
};

为什么要用seq filesystem,在这篇文档里说的比较清晰 https://www.oschina.net/question/234345_47909

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hanhandan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值