Linux字符设备——如果读取缓冲区太小怎么办?

Linux字符设备——如果读取缓冲区太小怎么办?,linux,linux-kernel,linux-device-driver,android-kernel,Linux,Linux Kernel,Linux Device Driver,Android Kernel,我正在创建一个linux设备驱动程序来创建一个字符设备。 它在读取时返回的数据在逻辑上划分为16字节单元 我计划通过返回读取缓冲区中适合的单元数来实现这个划分,但是如果读取缓冲区太小,我不确定该怎么办(您可以像数据报套接字设备驱动程序那样操作:它总是只返回一个数据报。如果读取缓冲区较小,多余的数据报将被丢弃——调用者负责为整个数据报提供足够的空间(通常,应用程序协议指定最大数据报大小) 您设备的文档应指定它以16字节为单位工作,因此调用者没有理由希望提供小于此值的缓冲区。因此,由于上述丢弃而丢失

我正在创建一个linux设备驱动程序来创建一个字符设备。 它在读取时返回的数据在逻辑上划分为16字节单元


我计划通过返回读取缓冲区中适合的单元数来实现这个划分,但是如果读取缓冲区太小,我不确定该怎么办(您可以像数据报套接字设备驱动程序那样操作:它总是只返回一个数据报。如果读取缓冲区较小,多余的数据报将被丢弃——调用者负责为整个数据报提供足够的空间(通常,应用程序协议指定最大数据报大小)

您设备的文档应指定它以16字节为单位工作,因此调用者没有理由希望提供小于此值的缓冲区。因此,由于上述丢弃而丢失的任何数据都可能被视为调用应用程序中的错误

但是,如果调用者要求,一次返回16个以上也是合理的,这表明应用程序会将其本身拆分为多个单元。这可能会提高性能,因为它可以最小化系统调用。但是如果缓冲区不是16的倍数,则可以丢弃最后一个单元的剩余部分。请确保这一点是有文件记录的,所以他们知道要把它变成一个倍数


如果您担心像
cat
这样的通用应用程序,我认为您不需要这样做。我希望它们使用非常大的输入缓冲区,仅仅是出于性能原因。

存在
ETOOSMALL
错误code@user1034749
ETOOSMALL
是为NFSv3创建的,大多数工具将其视为“未知错误525”。可能
EINVAL
更合适?与尽可能多地填充缓冲区相比,这是否会对性能产生负面影响?可能。由于消息的大小是固定的,您可以返回尽可能多的数据,并允许应用程序将其拆分为多个单元。