【问题标题】:linux kernel programming infinite looplinux内核编程无限循环
【发布时间】:2014-12-01 07:18:52
【问题描述】:

对 linux 内核编程完全陌生,想知道为什么我的设备读写时会抛出无限循环:

echo "hi" > simpchar
cat simpchar

static ssize_t device_read(struct file *filp, char *buff,
        size_t len, loff_t * off)
{
    int bytes_read = 0;
    int idxr = 0;
    while (len && (msg[idxr] != 0)) {
        put_user(msg[idxr], buff++);
        len--;
        bytes_read++;
        idxr++;
    }   
    return bytes_read;
}

static ssize_t device_write(struct file *filp, const char *buff,
        size_t len, loff_t * off)
{
    int bytes_read = 0;
    memset(msg, 0, BUF_LEN);
    int idxr = 0;
    while (len > 0) {
        msg[idxr++] = buff[idxr++];  
        len--;
        bytes_read++;
    }   
    return bytes_read;
}

【问题讨论】:

  • simpchar? char dev 是要读还是写?那么命令必须是echo "hi" > simpchar && cat simpchar

标签: c linux kernel


【解决方案1】:

您在这里缺少的是对loff_t * off 的更新。 这是文件描述符与您在文件中的位置保持一致的方式。

在您的代码中,每次调用 read()/write() 总是从偏移量 0 开始。

how-to-test-your-own-linux-module

【讨论】:

    【解决方案2】:

    一个小错误。您在两者中都以 message[idxr++]=buffer[idxr++] 的形式给出了 idxr++。这将使 idxr 增加两次,因此即使它没有进入无限循环,您也不会得到结果。创建一个新变量说 count=0 并尝试返回 count。

    【讨论】:

    • len 一直倒计时到零。 bytes_readlen 最初的值,也是正确的返回值(当然,它应该称为 bytes_written)。
    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多