我是linux新手,正在创建一个模块,用户可以在其中读取和写入设备文件。以下是我的代码,其中读取工作正常但不是写入功能。
MODULE_LICENSE("DUAL BSD/GPL");
char message[80];
char *msg_ptr;
int dev_major = 0;
int dev_minor = 0;
struct cdev *cdev;
ssize_t dev_read(struct file *filp,char __user *buf,size_t count,loff_t *offset)
{
int i;
i=copy_to_user(buf,msg_ptr,count);
printk(KERN_ALERT"buff:%s",buf);
return 0;
}
ssize_t dev_write(struct file *filp,const char __user *buf,size_t count,loff_t *offset)
{
int j;
msg_ptr = kmalloc(sizeof(*buf),GFP_KERNEL);
copy_from_user(msg_ptr,buf,sizeof(*buf));
//printk(KERN_ALERT"msg_ptr:%s",msg_ptr);
return 0;
}
当我创建一个char节点,然后使用echo hi> / dev / my_dev然后它打印hi,但写入/ var / log / messages中的infintely。
答案 0 :(得分:1)
这一行看起来不对:
copy_from_user(msg_ptr, buf, sizeof(*buf));
您只复制sizeof(*buf)
个字节,这可能是4个或8个字节,具体取决于架构。
您应该使用count
参数。
答案 1 :(得分:0)
dev_write
应该返回写入的字节数
当你返回0时,Linux知道你写了0个字节,并再次打电话给你写剩下的。再次......
dev_read
相同。