读取部分可用数据时,Linux tty翻转缓冲区锁

时间:2018-01-18 14:43:52

标签: linux linux-kernel linux-device-driver tty

我有一个基于linux内核中的新serdev总线构建的驱动程序。

在我的驱动程序中,我从外部设备接收消息,所有消息都以空字节(0x00)结束,协议确保我的数据(COBS)中没有空字节。现在我尝试让TTY层通过在我的输入中扫描零来传递完整的消息,如果没有,我只会在字节可用时从tty层调用的回调中返回零。

这种作品。或者更确切地说它适用于某些消息。过了一会儿,虽然它锁定了,tty层不断地发送相同大小的接收字节。我的猜测是,当tty翻转缓冲区的一半已满并且我的其余信息在另一半时,会发生这种情况。

我有两个问题:

  1. 我是否正确,tty图层可以"挂起"直到我读出翻转缓冲区的一半中的所有数据?

  2. 如果是这样,有什么方法可以防止这种情况发生吗?我宁愿不在已有的tty缓冲区之上实现我自己的缓冲方案。

  3. 由于

1 个答案:

答案 0 :(得分:0)

看起来(drivers/tty/tty_buffer.c和函数flush_to_ldisc)不可能做我试图做的事情。当tty缓冲区即将翻转时,消费者将不得不进行读取并缓冲任何一半的消息。

也就是说,返回零并希望下次回调中的大块数据只能工作到缓冲区的第一部分结束,然后必须读取最后一位数据。

这在用户空间中不是问题,因为read调用将具有您想要的最多字节数,但read可以自由返回比请求的字节数更少的字节。