gpt4 book ai didi

cat 函数无限次调用 read()

转载 作者:太空宇宙 更新时间:2023-11-04 12:26:59 30 4
gpt4 key购买 nike

我正在研究简单的字符设备驱动程序。我已经在模块中实现了读写功能,问题是当我尝试使用 cat/dev/devicefile 读取设备文件时,它会进入无限循环,即重复读取相同的数据。有人可以建议我解决这个问题吗?下面是我的驱动程序代码。

#include<linux/module.h>
#include<linux/fs.h>
#include<linux/string.h>
#include<asm/uaccess.h>
#include<linux/init.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("character device driver");
MODULE_AUTHOR("Srinivas");

static char msg[100]={0};

static int t;

static int dev_open(struct inode *, struct file *);
static int dev_rls(struct inode *, struct file *);
static ssize_t dev_read(struct file *, char *,size_t, loff_t *);
static ssize_t dev_write(struct file *, const char *, size_t,loff_t *);

static struct file_operations fops =
{
.read = dev_read,
.open = dev_open,
.write = dev_write,
.release = dev_rls,
};
static int himodule( void )
{
t = 0;
t = register_chrdev(0, "chardevdriver", &fops);
if (t < 0)
printk(KERN_ALERT"device registration failed\n");
else
printk(KERN_ALERT"device registered successfully\n");

printk(KERN_ALERT"major number is %d", t);
return 0;
}
static void byemodule(void)
{
unregister_chrdev(t, "chardevdriver");
printk(KERN_ALERT"successfully unregistered\n");
}

static int dev_open(struct inode *inod, struct file *fil)
{
printk(KERN_ALERT"inside the dev open");
return 0;
}
static ssize_t dev_read(struct file *filp, char *buff, size_t len, loff_t *off)
{
short count = 0;
while (msg[count] != 0) {
put_user(msg[count], buff++);
count++;
}
return count;
}

static ssize_t dev_write(struct file *filp, const char *buff, size_t len, loff_t *off)
{
short count = 0;
printk(KERN_ALERT"inside write\n");

memset(msg,0,100);

printk(KERN_ALERT" size of len is %zd",len);

while (len > 0) {
msg[count] = buff[count];
len--;
count++;
}
return count;
}

static int dev_rls(struct inode *inod,struct file *fil)
{
printk(KERN_ALERT"device closed\n");
return 0;
}
module_init(himodule);
module_exit(byemodule);

最佳答案

.read 函数还应正确处理其 lenoff 参数。实现从内存缓冲文件读取的最简单方法是使用 simple_read_from_buffer 助手:

static ssize_t dev_read(struct file *filp, char *buff, size_t len, loff_t *off)
{
return simple_read_from_buffer(buff, len, off, msg, 100);
}

出于教育目的,您可以检查该助手的代码(在 fs/libfs.c 中定义)。

顺便说一句,对于您的 .write 方法,您可以使用 simple_write_to_buffer 助手。

关于cat 函数无限次调用 read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44333483/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com