2016-06-09 32 views
4

我正在创建一个创建字符设备的linux设备驱动程序。 它在读取时返回的数据在逻辑上被划分为16个字节的单元。Linux字符设备 - 如果读取缓冲区太小,该怎么办?

我打算通过返回读取缓冲区中的许多单元来实现这一划分,但我不确定如果读取缓冲区太小(< 16字节)该怎么办。

我应该在这里做什么?还是有更好的方法来实现我试图表示的分工?

+3

有'ETOOSMALL'错误代码 – fghj

+0

@ user1034749'ETOOSMALL'是为NFSv3创建的,大多数工具将其视为'未知错误525'。也许'EINVAL'会更合适? –

回答

5

您可以像数据报套接字设备驱动程序一样行事:它总是只返回一个数据报。如果读缓冲区较小,则多余部分被丢弃 - 调用者有责任为整个数据报提供足够的空间(通常,应用程序协议指定最大数据报大小)。

您的设备的文档应该指定它以16个字节为单位进行工作,所以没有任何理由让调用者想要提供比这更小的缓冲区。因此,由于上述丢弃而导致的任何丢失数据都可能被视为调用应用程序中的错误。

但是,如果调用者要求返回多于16个参数,则返回多于16也是合理的 - 这表明应用程序会将其自身分解为单元。这可能是更多的性能,因为它最大限度地减少了系统调用。但是,如果缓冲区不是16的倍数,则可以丢弃最后一个单元的剩余部分。只要确保这是有记录的,所以他们知道使它成倍数。

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

+1

与填充缓冲区相比,这会对性能产生负面影响吗? –

+0

可能。由于您的邮件是固定大小的,您可以返回尽可能多的数据,并允许应用程序将其分解为单位。 – Barmar

相关问题