2009-08-10 57 views
5

在Linux write()函數中處於相當高的水平,它會過濾出寫入0長度緩衝區的請求。這是有道理的。誰願意讓操作系統浪費時間來瀏覽圖層,以確定沒有工作要做?調用write()的長度爲零的後果是什麼?

嗯...我。

這與question有關;並且如果地址(在數據之前在總線上發送)在握手錯誤的情況下會發出錯誤,則發現位串接的I2C驅動器將提供可能有用的返回碼。

可以在地址後發送虛擬數據,但不能與我正在使用的設備一起發送。 (也許我會嘗試閱讀...)。

所以,問題是:什麼樣的地獄的將你的核心是允許零(0)長度寫入被釋放?

回答

2

只爲關閉的緣故,我與更新驅動程序和發佈補丁的沃倫·揚的想法去(當我得到一個圓tuit)。

+0

這將最終幫助我們其他人。謝謝 – 2009-08-28 00:41:35

0

不是一個嚴肅的回答:你會獲得類似touch程序:P

1

很少,我認爲 - 有可能是零長度寫會阻塞,如果它寫入緩衝區在一些司機中也有零可用空間。不允許零長度的寫入可以使事情變得更簡單 - 以及避免大量浪費的工作。

爲什麼不直接刪除檢查,看看是什麼樣的地獄居然掙脫? :)

5

你所描述的內容基本上是相同類型的邪惡,侵犯了幾個Windows API需要不可預知的內存量。練習是在沒有緩衝區的情況下調用它們來放置它們的工作,無論如何它們都會完成這項工作,而不會存儲結果,但需要計算它們在此過程中需要的字節數。然後你分配一個這樣大小的緩衝區,然後用緩衝區再次調用函數,知道大小。

這是別提邪惡。這是與腐朽的官僚機構相當的計算機編程,每個部門都要求你填寫一張與你上一個部門的信息大部分相同的表格,但由於每個表格上都有一些不同的信息,他們不會僅僅拿一份你給其他人的表格的副本。 Ptui!

編程時間是昂貴的,CPU時間是便宜。要求程序員將相同的API調用寫入N次,以表明API本身可以自行解決的一些世界狀態試圖反轉這一點。最好的做法是讓驅動程序盡其所能確保write()成功。如果可以事先預測它不能通過檢查某個世界狀態而獲得成功,那麼也許應該是一個ioctl()。

+0

+1硬件解決方法屬於內核......但如果它不是,並且這是一個非常舊的(無法維護的)內核,那麼在用戶空間中解決這個問題可能是合理的。 – bdonlan 2009-08-10 15:19:05

+0

但在這種情況下,我實際上並不想寫 - 所以窗口類比不適用。我真的想'寫'零字節。否則,我會通過向已建立的驅動程序添加專有的ioctl調用來更改API。 – Jamie 2009-08-11 13:04:46

+3

我不認爲你應該*給司機添加專有的呼叫。我認爲您應該將此行爲指向維護該驅動程序的人員,並要求他們爲他們提供一個補丁來公開此功能。它可以被稱爲I2C_PING功能。 ioctls()是實現此目的的一種方法。/proc和sysctl是別人。 – 2009-08-11 23:39:37

0

我不寒而慄,建議一個ioctl(),但不會是一個更好的接口獲得有關接口的狀態信息?

0

什麼將一個零長度寫的是什麼意思?一般來說,寫入意味着數據的傳輸......我相信更多的問題會由於不檢查而導致,從而導致大量的錯誤輸入給驅動程序。y

如果它是一個單一位信息「做這個」你打電話後,我認爲ioctl是要走的路。它不漂亮,但你能做什麼?

或者,採取核選項,使用mmap()並將整個事物移入用戶空間。開銷較低,您可以編寫經典的代碼,如「將X寫入此寄存器」,這幾乎是您所需要的。

相關問題