鼠标事件在Linux中如何工作?


25

这主要是出于好奇,我试图了解事件处理的底层原理,所以请不要将我引向能够为我做的软件。

例如,如果我想用C / C ++编写一个能够对鼠标单击做出反应的程序,那么我假设我需要使用系统调用将某些功能连接到内核,或者也许您只需要不断检查鼠标的状态,我不知道。

我认为这是有可能的,因为在C / C ++中几乎所有功能都是如此,它是如此低的水平,尽管我可能永远不必自己实现它,但我对它的工作方式最感兴趣。

问题是它如何在linux中工作,是否存在某些系统调用,c库等?

Answers:


28

如果要编写在Linux中使用鼠标的真实程序,则很可能是在编写X应用程序,在这种情况下,应向X服务器询问鼠标事件。 QtGTKlibsdl是一些流行的C库,它们提供访问鼠标,键盘,图形,计时器以及编写GUI程序所需的其他功能的功能。 Ncurses是用于终端应用程序的类似库。

但是,如果您正在探索系统,或者由于某种原因无法使用X,则这是它在内核接口上的工作方式。

UNIX哲学中的核心思想是“一切都是文件”。更具体地说,应该通过用于处理文件的相同系统调用来访问尽可能多的内容。因此,鼠标的内核接口是设备文件。您open()可以选择调用poll()或调用select()它来查看是否有传入数据,并read()读取数据。

在USB之前的时代,特定的设备文件通常是一个串行端口,例如/dev/ttyS0,或PS / 2端口/dev/psaux。您使用鼠标内置的任何硬件协议与鼠标进行了交谈。如今,/dev/input/*子系统是首选,因为子系统提供了一种统一的,与设备无关的方式来处理许多不同的输入设备。特别是,/dev/input/mice将通过连接到系统的任何鼠标为您/dev/input/mouseN提供事件,并通过特定鼠标为您提供事件。在大多数现代Linux发行版中,插入鼠标时会动态创建这些文件。

有关确切读取或写入鼠标设备文件的详细信息,可以从内核文档中的input / input.txt开始。特别要看3.2.2节(mousedev)和3.2.4节(evdev),以及第4和5节。


8

通常,来自硬件设备的信息通过设备文件公开给应用程序。对于鼠标,在现代Linux系统上,设备是/dev/mice(该设备从所有连接的鼠标收集事件,还有对应于每个单独鼠标的设备)。

当您移动或单击鼠标时,鼠标会向计算机发送电信号,从而引起计算机中断。Linux内核中的一段称为中断处理程序的代码依次读取事件数据(例如,按下了哪个按钮)并触发内核内部的一系列通知。

如果有任何应用程序正在从与此设备相对应的设备文件中读取,则该应用程序将被告知输入正在等待。例如,如果应用程序在系统调用中被阻止,则系统调用返回。read

在典型的系统上,有一个读取鼠标事件的进程:X Window服务器。该程序管理图形显示和输入外围设备。然后,通过通用X事件协议将鼠标事件通知各个图形应用程序,该协议携带其他事件类型,例如按键,窗口焦点更改,窗口可见性更改等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.