procfs - MarekBykowski/readme GitHub Wiki
What it provides
/proc/my_bool
echo 1 > /proc/my_bool → set true
echo 0 > /proc/my_bool → set false
cat /proc/my_bool # prints 0 or 1
// my_bool.c
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#define PROC_NAME "my_bool"
static bool my_bool;
/* ---------- read ---------- */
static ssize_t my_bool_read(struct file *file,
char __user *buf,
size_t count,
loff_t *ppos)
{
char tmp[4];
int len;
/* one-shot read */
if (*ppos != 0)
return 0;
len = scnprintf(tmp, sizeof(tmp), "%d\n", my_bool);
if (copy_to_user(buf, tmp, len))
return -EFAULT;
*ppos = len;
return len;
}
/* ---------- write ---------- */
static ssize_t my_bool_write(struct file *file,
const char __user *buf,
size_t count,
loff_t *ppos)
{
int val;
if (kstrtoint_from_user(buf, count, 0, &val))
return -EINVAL;
my_bool = !!val; /* normalize to 0 or 1 */
return count;
}
/* ---------- file ops ---------- */
static const struct file_operations my_bool_ops = {
.read = my_bool_read,
.write = my_bool_write,
.llseek = noop_llseek,
};
/* ---------- module init ---------- */
static int __init my_bool_init(void)
{
if (!proc_create(PROC_NAME, 0666, NULL, &my_bool_ops))
return -ENOMEM;
pr_info("my_bool loaded\n");
return 0;
}
/* ---------- module exit ---------- */
static void __exit my_bool_exit(void)
{
remove_proc_entry(PROC_NAME, NULL);
pr_info("my_bool unloaded\n");
}
module_init(my_bool_init);
module_exit(my_bool_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simplest procfs boolean driver");
MODULE_AUTHOR("you");
obj-m += my_bool.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean