Answers:
如果要编写在Linux中使用鼠标的真实程序,则很可能是在编写X应用程序,在这种情况下,应向X服务器询问鼠标事件。 Qt,GTK和libsdl是一些流行的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节。
通常,来自硬件设备的信息通过设备文件公开给应用程序。对于鼠标,在现代Linux系统上,设备是/dev/mice
(该设备从所有连接的鼠标收集事件,还有对应于每个单独鼠标的设备)。
当您移动或单击鼠标时,鼠标会向计算机发送电信号,从而引起计算机中断。Linux内核中的一段称为中断处理程序的代码依次读取事件数据(例如,按下了哪个按钮)并触发内核内部的一系列通知。
如果有任何应用程序正在从与此设备相对应的设备文件中读取,则该应用程序将被告知输入正在等待。例如,如果应用程序在系统调用中被阻止,则系统调用返回。read
在典型的系统上,有一个读取鼠标事件的进程:X Window服务器。该程序管理图形显示和输入外围设备。然后,通过通用X事件协议将鼠标事件通知各个图形应用程序,该协议携带其他事件类型,例如按键,窗口焦点更改,窗口可见性更改等。