2016-06-09 50 views
4

我正在創建一個創建字符設備的linux設備驅動程序。 它在讀取時返回的數據在邏輯上被劃分爲16個字節的單元。Linux字符設備 - 如果讀取緩衝區太小,該怎麼辦?

我打算通過返回讀取緩衝區中的許多單元來實現這一劃分,但我不確定如果讀取緩衝區太小(< 16字節)該怎麼辦。

我應該在這裏做什麼?還是有更好的方法來實現我試圖表示的分工?

+3

有'ETOOSMALL'錯誤代碼 – fghj

+0

@ user1034749'ETOOSMALL'是爲NFSv3創建的,大多數工具將其視爲'未知錯誤525'。也許'EINVAL'會更合適? –

回答

5

您可以像數據報套接字設備驅動程序一樣行事:它總是隻返回一個數據報。如果讀緩衝區較小,則多餘部分被丟棄 - 調用者有責任爲整個數據報提供足夠的空間(通常,應用程序協議指定最大數據報大小)。

您的設備的文檔應該指定它以16個字節爲單位進行工作,所以沒有任何理由讓調用者想要提供比這更小的緩衝區。因此,由於上述丟棄而導致的任何丟失數據都可能被視爲調用應用程序中的錯誤。

但是,如果調用者要求返回多於16個參數,則返回多於16也是合理的 - 這表明應用程序會將其自身分解爲單元。這可能是更多的性能,因爲它最大限度地減少了系統調用。但是,如果緩衝區不是16的倍數,則可以丟棄最後一個單元的剩餘部分。只要確保這是有記錄的,所以他們知道使它成倍數。

如果您擔心像cat這樣的通用應用程序,我認爲您不需要。我希望他們使用非常大的輸入緩衝區,僅僅是出於性能的原因。

+1

與填充緩衝區相比,這會對性能產生負面影響嗎? –

+0

可能。由於您的郵件是固定大小的,您可以返回儘可能多的數據,並允許應用程序將其分解爲單位。 – Barmar

相關問題