创建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(®ister_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