【问题标题】:Unbuffered misc_device read - linux kernel driver未缓冲的 misc_device 读取 - linux 内核驱动程序
【发布时间】:2016-11-22 15:59:27
【问题描述】:

我正在编写 Linux misc_device 驱动程序,但读取时遇到问题。现在内核将驱动程序视为一个快速设备:驱动程序读取被缓冲,直到用户空间调用者所需的数据可用(例如从磁盘读取文件时)。这意味着读取系统调用在缓冲区已满之前不会返回。我想改变这种行为,并告诉内核在某些数据可用时立即返回系统调用(例如在套接字上读取)。

有可能吗?如何?我做错了吗?

谢谢!

【问题讨论】:

  • 不知道九周后你是否仍然对这个问题感兴趣,但是:你确定阻塞发生在内核中吗?我的回忆是,检查结构文件 f_flags 中的 O_NONBLOCK 并在必要时阻止等待输入是驱动程序的工作。否则,如果没有设置 O_NONBLOCK ,它应该在每次读取调用时读取尽可能多的数据并立即返回,并且当读取调用最终发生并且根本没有数据要读取时,返回 0 字节以告诉调用者停止。设置 O_NONBLOCK 与否当然是用户空间的工作。

标签: c linux linux-kernel


【解决方案1】:

由于您没有回答我的评论:通常,等待有足够的数据可用是由驱动程序完成的(即您必须在代码中完成),而不是由通用内核代码完成,尽管您的驱动程序将使用通用内核代码去做[1]。您应该检查结构文件 f_flags 成员中的 O_NONBLOCK 以了解您是否应该等待。但是,用户空间可能会继续在循环中调用 read(),直到 read() 返回读取的零字节。因此,如果您接到 read 调用并且自上次调用以来没有新数据到达,则将读取的字节设置为零很重要。希望对您有所帮助。

[1]http://www.makelinux.net/ldd3/chp-6-sect-2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-05
    • 2015-12-31
    • 2016-03-23
    • 1970-01-01
    • 2011-02-10
    • 2017-03-02
    • 2023-03-18
    • 2015-01-23
    相关资源
    最近更新 更多