【发布时间】:2017-01-13 23:52:04
【问题描述】:
您好,我需要一些关于学校代码的帮助。
读取函数不应该return 0所以老师告诉我们使用wait_event_interruptible。
我的问题是当我想在控制台中使用(例如)命令尝试它时:
echo 1234 > ringdev # my character device
echo 5 > ringdev
cat ringdev
我只得到一个结果:5。
我想得到一个结果:
1234
5。
全局变量:
static char ringdev_buf[4096];
static size_t ringdev_len;
读取函数:
static ssize_t ringdev_read(struct file *filp, char __user *buf, size_t count,
loff_t *off)
{
ssize_t ret = 0;
while(1) {
wait_event_interruptible(head,ringdev_len!=0);
mutex_lock(&ringdev_lock);
if(ringdev_len!=0) {
ret = -EFAULT;
if (copy_to_user(buf, ringdev_buf,ringdev_len)) { // I was trying everything in the ringdev_len position.
ret = ringdev_len;
goto out_unlock;
}
}
mutex_unlock(&ringdev_lock);
}
out_unlock:
mutex_unlock(&ringdev_lock);
return ret;
}
我试图在函数copy_to_user(buf, ringdev_buf,count) 中输入任何值,但结果始终相同。
static ssize_t ringdev_write(struct file *filp, const char __user *buf,
size_t count, loff_t *off)
{
ssize_t ret=0;
mutex_lock(&ringdev_lock);
ret=-EFAULT;
if(ringdev_len + count < sizeof(ringdev_buf)) {
if (copy_from_user(ringdev_buf+ringdev_len, buf, count)==0) {
ringdev_len=ringdev_len+count;
ret=count;
wake_up_interruptible(&head);
goto out_unlock;
}
} else {
ret=-ENOSPC;
}
out_unlock:
mutex_unlock(&ringdev_lock);
return ret;
}
【问题讨论】:
-
读取应该复制给用户要读取的整个缓冲区,而不仅仅是一个字符。等待时也要注意,等待后条件可能仍然不满足;在这种情况下,您应该返回 -EINTR。在写作方面,事情实际上看起来还不错
-
另外,我们希望 1234\n5\n 是 echo 命令之后的内容(cat 会在不同的行上显示 1234 和 5)
-
@PaulStelian 发布答案:p.
-
@Stargateur 我只会发布肯定或最有可能是问题的答案,而不是猜测(即使它们是有根据的猜测)
-
在读取时您返回错误案例的长度?!
标签: c linux-kernel linux-device-driver