封装后的一个简单字符设备

//将数据封装后
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include<asm/uaccess.h>


MODULE_LICENSE("GPL");
MODULE_AUTHOR("you");




struct mycdev{
struct cdev cdev;
dev_t devno;
unsigned char data[1024];
};


struct file_operations ops;
int my_open(struct inode *inode, struct file *filp);
int my_release(struct inode *inode, struct file *filp);
ssize_t my_read(struct file *filp, char __user *buf, size_t size, loff_t * off);
ssize_t my_write(struct file *filp, const char __user *buf, size_t size, loff_t *off);


struct mycdev dog;
struct mycdev tom;
int test_init(){
ops.open = my_open;
ops.release = my_release;
ops.read = my_read;
ops.write = my_write;




cdev_init(&dog.cdev,&ops);
dog.devno = MKDEV(9,1);
cdev_add(&dog.cdev,dog.devno,1);


cdev_init(&tom.cdev,&ops);
tom.devno=MKDEV(9,2);
cdev_add(&tom.cdev,tom.devno,1);


printk("hello world\n");

return 0;
}
void test_exit()
{
printk("goodbye cruel world\n");
}
module_init(test_init);
module_exit(test_exit);


int my_open(struct inode *inode, struct file *filp)
{
struct cdev *c = inode->i_cdev;
struct mycdev *this = (struct mycdev *)c;
//struct mycdev *this = container_of(inode->i_cdev,struct mycdev,cdev);
filp->private_data = this;
printk("this is my_open\n");
return 0;


}


int my_release(struct inode *inode, struct file *filp){
printk("goodbye release\n");
return 0;
}


ssize_t my_read(struct file *filp, char __user *buf, size_t size, loff_t * off){
struct mycdev *this = filp->private_data;
copy_to_user(buf,this->data,size);
return size;
}
ssize_t my_write(struct file *filp, const char __user *buf, size_t size, loff_t *off){
struct mycdev *this = filp->private_data;
copy_from_user(this->data,buf,size);
return size;

}

Makefile:



default:
make -C /home/linux-2.6.28_smdk6410 M=`pwd`
clean:
make -C /home/linux-2.6.28_smdk6410 M=`pwd` clean
rm -rf modules.order
obj-m +=test.o


open.c

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int fd;
if(argc < 2)
{
printf("<./open wangcai\n");
exit(1);
}
fd = open(argv[1],O_RDWR);
if(fd<0)
{
perror("open");
exit(1);
}

close(fd);
return 0;
}

write.c
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
// ./write wangcai wangwangwang
int main(int argc,char *argv[])
{
int fd;
int ret;
unsigned char buff[1024];
if(argc < 3)
{
printf("<%s> <dev> <contest>\n",argv[0]);
exit(1);
}
fd = open(argv[1],O_RDWR);
if(fd<0)
{
perror("open");
exit(1);
}
ret = write(fd,argv[2],strlen(argv[2]));
if(ret<0)
{
perror("write\n");
exit(1);
}

close(fd);
return 0;
}


read.c:

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int fd;
int ret;
unsigned char buff[1024]={0};
if(argc < 3)
{
printf("<%s> <%s> <%s>\n",argv[0],argv[1],argv[2]);
exit(1);
}
fd = open(argv[1],O_RDWR);
if(fd<0)
{
perror("open");
exit(1);
}

ret = read(fd,buff,1024);
if(ret<0)
{
perror("read");
exit(1);
}

close(fd);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值