2018年2月13日 星期二

Linux kernel - 建立/sys文件系统訪問kernel - single_open

#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>

MODULE_LICENSE("Dual BSD/GPL");
#define PROCNAME "sample"
#define CMD "hello world"

static int sample_proc_show(struct seq_file *m, void *v)
{
 seq_printf(m, "%s\n", CMD);
 return 0;
}

static int sample_proc_open(struct inode *inode, struct file *file)
{
 return single_open(file, sample_proc_show, NULL);
}

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

static int sample_init(void)
{
#if 1
 struct proc_dir_entry *entry;
 
 entry = create_proc_entry(PROCNAME, S_IRUGO | S_IWUGO, NULL);

 if (entry)
  entry->proc_fops = &sample_proc_fops;
#else
 proc_create(PROCNAME, 0, NULL, &sample_proc_fops);
#endif

 printk(KERN_INFO "driver loaded\n");

 return 0;
}

static void sample_exit(void)
{
 remove_proc_entry(PROCNAME, NULL);

 printk(KERN_INFO "driver unloaded\n");
}
module_init(sample_init);
module_exit(sample_exit);

沒有留言:

張貼留言