keropoの備忘録

しらべたことをメモるブログ

Linuxデバイスドライバ基礎② procインタフェース

procインタフェースを利用してユーザランドからカーネル(ドライバ)と通信するサンプル

procfs.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/stat.h>

MODULE_LICENSE("GPL");

#define PROC_NAME "driver/example"

static int proc_open(struct inode *node, struct file *fp)
{
        printk("open\n");
        return 1;
}

static ssize_t proc_read(struct file *fp, char *buf, size_t size, loff_t *off)
{
        printk("read\n");
        return size;
}


static ssize_t proc_write(struct file *fp, const char *buf, size_t size, loff_t *off)
{
        printk("write\n");
        return size;
}

static struct file_operations example_proc_fops = {
        .owner = THIS_MODULE,
        .open = proc_open,
        .read = proc_read,
        .write = proc_write,
};

static __init int procfs_init(void)
{
        struct proc_dir_entry *ent;

        ent = proc_create(PROC_NAME, S_IRUGO | S_IWUGO | S_IXUGO, NULL, &example_proc_fops);
        if (ent == NULL)
        {
                return -ENOMEM;
        }

        printk("proc example loaded\n");
        return 0;
}

static __exit void procfs_exit(void)
{
        printk("delete dirver\n");
        remove_proc_entry(PROC_NAME, NULL);
}

module_init(procfs_init);
module_exit(procfs_exit);