2014-01-18 71 views
0

我正在編寫一個程序來跟蹤Linux中的鼠標移動。我在另一篇文章中讀到,這可以通過使用read()系統調用來讀取與鼠標有關的EventX文件來完成。我早些時候正在讀取串口文件,並使用read()來讀取它。但是,然後我發送了一個字符數組並返回了串行字符。但是,它似乎不在鼠標的情況下。行:在linux中爲事件文件讀取()

struct input_event ie; 
read(fd, &ie, sizeof(struct input_event) 

被用來讀取它。這裏的ie是一個結構。但我曾經在串口的情況下發送一個字符緩衝區。所以,我的問題是:我怎麼知道發送什麼結構/緩衝區。在google搜索之後,我已經知道了上面兩個代碼行的答案,但是如果我想閱讀其他文件,我將如何知道要發送什麼結構/緩衝區。請幫幫我。

謝謝。

+0

您是否在尋找某種結構到設備的主列表? –

+0

通常你使用一些[X11](http://en.wikipedia.org/wiki/X11)服務器.... –

+0

是的,至少是定義了它讀取的變量類型的東西。這個原型:ssize_t read(int fd,void * buf,size_t count); – jay

回答

0

Linux中的輸入子系統使用標準格式來傳遞其消息。這其實是很簡單:

  1. 您打開相關的輸入文件,通常/dev/input/event<n>,使用open()系統調用。
  2. 您可以使用read()函數從該文件中讀取輸入事件,如您在問題中所述。

該文件中的每個事件都有一個衆所周知的結構:即struct input_event。您不需要知道該結構的確切佈局,這是由編譯器完成的。只需包含相關的頭文件:#include <linux/input.h>

你想知道的是這個結構中有用的字段,以及它們的含義。我建議您閱讀official documentation以及input.h來源。

+0

得到你在說什麼,但還有更多類型的文件,如事件文件,串行端口文件等。因爲在閱讀時,我需要知道要發送的結構()。原型沒有說這個。當事件需要struct input_event時,serila需要char緩衝區。那麼是否還有更多這樣的文件,如果存在,需要傳遞哪種緩衝區? – jay

+0

@jay:'read()'是一個通用的低級函數,它只是讀取字節,因此是'void *'。從普通文件讀取數據時,只需獲取存儲的數據即可,但是當從char設備讀取數據時,必須檢查特定設備的文檔以瞭解預期結果。在'/ dev/input/event '的情況下,這是我鏈接的內容,但有很多這樣的內容,因此無法在此列舉它們。 – rodrigo

+0

謝謝你清除它。你能給一個鏈接找到所有的人嗎?我感覺有點不完整。 – jay