簡體   English   中英

Linux內核write()和read()函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM