Linux字符设备——如果读取缓冲区太小怎么办?
Posted
技术标签:
【中文标题】Linux字符设备——如果读取缓冲区太小怎么办?【英文标题】:Linux character device -- what to do if read buffer is too small? 【发布时间】:2016-10-10 17:50:33 【问题描述】:我正在创建一个用于创建字符设备的 linux 设备驱动程序。 它在读取时返回的数据在逻辑上被划分为 16 个字节的单元。
我计划通过返回适合读取缓冲区的多少单元来实现此除法,但我不确定如果读取缓冲区太小(
我应该在这里做什么?或者有没有更好的方法来实现我想要代表的部门?
【问题讨论】:
有ETOOSMALL
错误码
@user1034749 ETOOSMALL
是为 NFSv3 创建的,大多数工具将其视为“未知错误 525”。也许EINVAL
会更合适?
【参考方案1】:
您可以像数据报套接字设备驱动程序一样:它总是只返回一个数据报。如果读取缓冲区较小,则丢弃多余的缓冲区——调用者有责任为整个数据报提供足够的空间(通常,应用程序协议指定最大数据报大小)。
您设备的文档应指定它以 16 字节为单位工作,因此调用者没有理由希望提供比这更小的缓冲区。因此,任何由于上述丢弃而丢失的数据都可能被视为调用应用程序中的错误。
但是,如果调用者要求,一次返回超过 16 个也是合理的 - 这表明应用程序会将其拆分为单元本身。这可能会提高性能,因为它可以最大限度地减少系统调用。但如果缓冲区不是 16 的倍数,您可以丢弃最后一个单元的剩余部分。只需确保将其记录在案,以便他们知道将其设为倍数。
如果您担心像cat
这样的通用应用程序,我认为您不需要这样做。出于性能原因,我希望它们使用非常大的输入缓冲区。
【讨论】:
与尽可能多地填充缓冲区相比,这会对性能产生负面影响吗? 可能。由于您的消息是固定大小的,因此您可以返回尽可能多的数据并允许应用程序将其拆分为多个单元。以上是关于Linux字符设备——如果读取缓冲区太小怎么办?的主要内容,如果未能解决你的问题,请参考以下文章