【问题标题】:C - infinite read from cat in Device fileC - 从设备文件中的 cat 无限读取
【发布时间】:2014-12-16 12:30:42
【问题描述】:

我一直对 cat 的无限读取感到头疼(cat 没有关闭,因为它没有从我的读取函数接收函数结束。如何实现读取结束以便使用 cat 读取文件终端中的每个命令只会产生 1 个输出?

功能。这是我编写的内核 read() 函数:

static ssize_t dev_read(struct file *file, char *buf, size_t count, loff_t *ppos)
{
char tmp_buf[MAX_BUF_SIZE]; //defined as 100
int bLen=0;
sprintf(tmp_buf, "Some message");
bLen = strlen(tmp_buf);

if(copy_to_user(buf,tmp_buf, bLen)){
     return -EFAULT;
}

 return bLen;
 }

【问题讨论】:

  • 数组 tmp_buf[] 尚未初始化,因此包含垃圾。因此,strlen[tmp_buf);几乎可以返回任何值(取决于随机 '\0' 碰巧所在的位置。也许您的意思是:bLen = sizeof tmp_buf; ?
  • 见上面的编辑。在 tmp_buf 中添加了“一些消息”。我需要一种方法来告诉 cat 只从设备读取一次而不是无限次。

标签: c linux character device cat


【解决方案1】:

我正在回答,因为我在搜索的早期就发现了这一点。

猫不断地阅读,直到它得到一个空的响应。一旦它完成了一些数据,它就会返回并询问“还有什么其他的吗?”您的模块说是并再次向其发送数据。您需要打破链条并让它发送一个空响应。最好的方法是放置

if(*ppos > 0){
    return 0;
}

在函数的开头并在退出前添加您要发送回 *ppos 的数据的长度。

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    相关资源
    最近更新 更多