c - Linux 内核 write() 和 read() 函数

标签 c linux-kernel linux-device-driver

您好,我的学校代码需要一些帮助。

读取函数不应该返回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) 中将任何值放入 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)会导致从ringdev_buf到buf的1字节复制,所以它是正确的,如果你想将整个缓冲区复制到用户空间,你必须将其更改为copy_to_user(buf,ringdev_buf,ringdev_len)

关于c - Linux 内核 write() 和 read() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359672/

相关文章:

linux - 从/dev/block/mmcblk0 和/dev/block/mmcblk0p1 读取的区别

android - Uinput虚拟设备在android上被检测为物理键盘

c - 调用 pthread_join 函数后 main 不再继续

linux-kernel - request_irq() 在内部做什么?

linux - 如何从内核向进程地址空间写入数据?

c - 如何获取网络设备统计信息?

linux - kprobe vs uprobe 系统调用插入

c - 填充位图像素数组

c++ - 是否可以在 C 程序中包含 C++ 库?

c - 在 C 帮助中获取一行用户输入。