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

Linux tty flip buffer lock when reading part of available data

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

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

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

我有两个问题:

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

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

谢谢

看起来(drivers/tty/tty_buffer.c 和函数 flush_to_ldisc)无法执行我尝试执行的操作。当 tty 缓冲区即将翻转时,消费者将不得不读取并缓冲任何一半的消息。

也就是说,return清零并希望下次在回调中获得更大的数据块只会工作到缓冲区第一部分的末尾,那么最后一位数据必须是阅读。

这在用户空间中不是问题,因为 read 调用的参数是您想要的最多字节数,但 read 可以比请求的字节数少 return 个字节。