[英]Linux Kernel write() and read() function
您好,我的學校代碼需要一些幫助。
讀取函數永遠不應return 0
因此Teacher告訴我們使用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)
的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;
}
調用copy_to_user(buf,ringdev_buf,1)導致將1個字節從ringdev_buf復制到buf,因此,如果要將整個緩沖區復制到用戶空間,則必須將其更改為copy_to_user(buf,ringdev_buf,ringdev_len)
if (copy_to_user(buf, ringdev_buf,ringdev_len))
應該:
if (copy_to_user(buf, ringdev_buf,ringdev_len)==0)
另外,我沒有正確制作char設備。 但是,謝謝您的幫助:)。 如果有人需要,我可以在這里將我的寫入/讀取功能發布在循環緩沖區上,在那里每個思維都可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.