Linux 自定义proc文件
Linux 自定义proc文件
=============================
简单实现读写操作
创建proc文件的3种方式:
http://www.cnblogs.com/TS-qrt/articles/linux_a.html http://www.cnblogs.com/TS-qrt/articles/linux_b.html http://www.cnblogs.com/TS-qrt/articles/linux_c.html
1. jproc.c 创建proc文件
#include <linux/module.h> #include <linux/kernel.h> #include <linux/proc_fs.h> #include <linux/sched.h> #include <asm/uaccess.h> #define STRINGLEN 1024 struct proc_dir_entry *jproc_dir, *jproc_file; char global_buffer[STRINGLEN]; int proc_read(char *page, char **start, off_t off, int count, int *eof, void *data) { int len; printk("-----proc_read-----\n"); len = sprintf(page, global_buffer);
*eof=1; //cat proc的时候回调用3次, 写了此句,调用2次 return len; } int proc_write(struct file *file, const char *buffer, unsigned long count, void *data) { int len; printk("-----proc_write----\n"); if(count == STRINGLEN) len = STRINGLEN - 1; else len = count; copy_from_user(global_buffer, buffer, len); global_buffer[len] = '\0'; return len; } static int __init jproc_init(void) { jproc_dir = proc_mkdir("jproc", NULL); jproc_file = create_proc_entry("jprocfile", S_IRUGO, jproc_dir); strcpy(global_buffer, "jproc"); jproc_file->read_proc = proc_read; jproc_file->write_proc = proc_write; return 0; } static void __exit jproc_exit(void) { remove_proc_entry("jprocfile", jproc_dir); remove_proc_entry("jproc", NULL); } module_init(jproc_init); module_exit(jproc_exit);
2. 测试
# echo 1234567890 > /proc/jproc/jprocfile # -----proc_write---- # cat /proc/jproc/jprocfile # -----proc_read----- # -----proc_read----- # -----proc_read----- # 1234567890 ps: 在写入, 1234567890内容会被新的覆盖
3. 注意事项
cat proc的时候会调用read函数3次 注意这个proc read 函数的原型,其中有一个变量 *eof,如果不将其置1,它会多触发一次读操作,将*eof 置1后,就会少一次执行。 另外两次打印是因为cat的执行过程调用了两次read操作 查看cat 命令的系统调用,可以用strace 命令查看,发现调用了两次read 函数,第一次读取所有的数据,第二次读到的长度为0,因为有两次读,所以会触发两次,如果自己写一个文件读函数,仅仅调用一次read 函数,则只会触发proc 读一次
浙公网安备 33010602011771号