?? rwbuf.c
字號:
#include"rwbuf.h"
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/fs.h>
//#include<modversions>
//
//struct file_operations rwbuf_fops
static int inuse=0;
static int rwbuf_open(struct inode *inode, struct file *filep){
if (inuse == 1)
return -1;
inuse =1;
MOD_INC_USE_COUNT; //?
return 0;
}
static int rwbuf_close(struct inode *inode, struct file *filep){
inuse =0;
MOD_DEC_USE_COUNT;
return 0;
}
#define rwbuf_size 200
static char rwbuf[rwbuf_size];
static int rwlen =0;
static ssize_t rwbuf_write (struct file *filep, const char *buf, size_t count, loff_t *ppos){
__generic_copy_from_user(rwbuf, buf,count);//?
rwlen = count;
return count;
}
static ssize_t rwbuf_read(struct file *filep, char *buf, size_t count, loff_t *ppos){
__generic_copy_to_user(buf,rwbuf,count);
return count;
}
static int rwbuf_ioctl( struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg){
if( cmd == RWBUF_CLEAR){
rwlen =0 ;
printk("rwbuf in kernel zero-ed \n");
}
return 0;
}
static struct file_operations
rwbuf_fops=
{
open: rwbuf_open,
release: rwbuf_close,
read: rwbuf_read,
write: rwbuf_write,
ioctl: rwbuf_ioctl,
};
int init_module(){
printk("Hello world\n");
if (register_chrdev(RWBUF_MAJOR, RWBUF_NAME,&rwbuf_fops)){
printk("register error\n");
return -1;
}
printk("register ok\n");
return 0;
}
void cleanup_module(){
if (unregister_chrdev(RWBUF_MAJOR,RWBUF_NAME)!=0)
printk("unreg err\n");
else
printk("unreg ok\n");
printk("bye\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -