⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.c

📁 《linux驱动程序设计从入门到精通》一书中所有的程序代码含驱动和相应的应用程序
💻 C
字号:
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2007, 2010 fengGuojin(fgjnew@163.com) */#include <linux/module.h>#include <linux/kernel.h>#include <linux/proc_fs.h>#include <linux/string.h>#include <linux/vmalloc.h>#include <asm/uaccess.h>MODULE_LICENSE("GPL");MODULE_DESCRIPTION("PROC FILE DEMO");#define MAX_DEMO_LENGTH   1024static struct proc_dir_entry *proc_entry;static char *DEMO_buffer;static int DEMO_index;static int next_demo;int demo_read( char *page, char **start, off_t off,                   int count, int *eof, void *data ){  int len;  if (off > 0) {    *eof = 1;    return 0;  }  if (next_demo >= DEMO_index) next_demo = 0;  len = sprintf(page, "%s\n", &DEMO_buffer[next_demo]);    next_demo += len;  return len;}ssize_t demo_write( struct file *filp, const char __user *buff,                        unsigned long len, void *data ){  int space_available = (MAX_DEMO_LENGTH-DEMO_index)+1;  if (len > space_available) {    printk(KERN_INFO "demo: DEMO buffer is full!\n");    return -ENOSPC;  }  if (copy_from_user( &DEMO_buffer[DEMO_index], buff, len )) {    return -EFAULT;  }  DEMO_index += len;  DEMO_buffer[DEMO_index-1] = 0;  return len;}int init_demo_module( void ){  int ret = 0;  DEMO_buffer = (char *)vmalloc( MAX_DEMO_LENGTH );  if (!DEMO_buffer) {    ret = -ENOMEM;  } else {    memset( DEMO_buffer, 0, MAX_DEMO_LENGTH );    proc_entry = create_proc_entry( "demo", 0644, NULL );    if (proc_entry == NULL)     {      ret = -ENOMEM;      vfree(DEMO_buffer);      printk(KERN_INFO "demo: Couldn't create proc entry\n");    }     else    {      DEMO_index = 0;      next_demo = 0;      proc_entry->read_proc = demo_read;      proc_entry->write_proc = demo_write;      proc_entry->owner = THIS_MODULE;      printk(KERN_INFO "demo: Module loaded.\n");    }  }  return ret;}void cleanup_demo_module( void ){  remove_proc_entry("demo", &proc_root);  vfree(DEMO_buffer);  printk(KERN_INFO "demo: Module unloaded.\n");}module_init( init_demo_module );module_exit( cleanup_demo_module );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -