Linux 字符设备 -- 读取缓冲区太小怎么办?
Linux character device -- what to do if read buffer is too small?
我正在创建一个 linux 用于创建字符设备的设备驱动程序。
它 returns 读取的数据在逻辑上分为 16 个字节的单元。
我正计划通过返回适合读取缓冲区的许多单元来实现此除法,但我不确定如果读取缓冲区太小(<16 字节)该怎么办。
我应该在这里做什么?或者有没有更好的方法来实现我要代表的部门?
您可以像数据报套接字设备驱动程序一样工作:它始终return只是一个数据报。如果读取缓冲区较小,则多余部分将被丢弃——调用者有责任为整个数据报提供足够的 space(通常,应用程序协议指定最大数据报大小)。
您设备的文档应指定它以 16 字节为单位工作,因此调用者没有理由想要提供比这更小的缓冲区。因此,由于上述丢弃而导致的任何数据丢失都可以被视为调用应用程序中的错误。
但是,如果调用者要求,一次 return 超过 16 个也是合理的——这表明应用程序会自行将其拆分为多个单元。这可能会提高性能,因为它最大限度地减少了系统调用。但是如果缓冲区不是 16 的倍数,您可以丢弃最后一个单元的剩余部分。只需确保将其记录在案,以便他们知道将其设为倍数。
如果您担心像 cat
这样的通用应用程序,我认为您不需要担心。出于性能原因,我希望他们使用非常大的输入缓冲区。
我正在创建一个 linux 用于创建字符设备的设备驱动程序。 它 returns 读取的数据在逻辑上分为 16 个字节的单元。
我正计划通过返回适合读取缓冲区的许多单元来实现此除法,但我不确定如果读取缓冲区太小(<16 字节)该怎么办。
我应该在这里做什么?或者有没有更好的方法来实现我要代表的部门?
您可以像数据报套接字设备驱动程序一样工作:它始终return只是一个数据报。如果读取缓冲区较小,则多余部分将被丢弃——调用者有责任为整个数据报提供足够的 space(通常,应用程序协议指定最大数据报大小)。
您设备的文档应指定它以 16 字节为单位工作,因此调用者没有理由想要提供比这更小的缓冲区。因此,由于上述丢弃而导致的任何数据丢失都可以被视为调用应用程序中的错误。
但是,如果调用者要求,一次 return 超过 16 个也是合理的——这表明应用程序会自行将其拆分为多个单元。这可能会提高性能,因为它最大限度地减少了系统调用。但是如果缓冲区不是 16 的倍数,您可以丢弃最后一个单元的剩余部分。只需确保将其记录在案,以便他们知道将其设为倍数。
如果您担心像 cat
这样的通用应用程序,我认为您不需要担心。出于性能原因,我希望他们使用非常大的输入缓冲区。