fif*_*ght 27 linux input devices
这主要是出于好奇,我试图了解事件处理是如何在低级别上工作的,所以请不要将我引用到可以为我完成的软件。
例如,如果我想用 C/C++ 编写一个对鼠标点击做出反应的程序,我假设我需要使用系统调用将某些函数挂接到内核,或者您可能只需要不断检查鼠标的状态,我不知道。
我认为这是可能的,因为在 C/C++ 中几乎所有事情都是可能的,因为级别如此之低,我最感兴趣的是它的工作原理,尽管我可能永远不必自己实现它。
问题是它在 linux 中是如何工作的,是否有某些系统调用、c 库等?
Jan*_*der 31
如果您正在编写在 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 节。
Gil*_*il' 12
通常,来自硬件设备的信息通过设备文件暴露给应用程序。对于鼠标,在现代 Linux 系统上,设备是/dev/mice
(该设备从所有连接的鼠标收集事件,也有与每个单独鼠标对应的设备)。
当您移动或单击鼠标时,鼠标会向计算机发送一个电信号,从而引起计算机的中断。Linux 内核中称为中断处理程序的一段代码依次读取事件数据(例如按下了哪个按钮)并触发内核内部的通知链。
如果有任何应用程序正在读取与该设备对应的设备文件,则该应用程序会被告知输入正在等待。例如,如果应用程序在系统调用中被阻塞,则系统调用返回。read
在典型的系统上,有一个进程读取鼠标事件:X Window 服务器。该程序管理图形显示和输入外围设备。然后通过通用 X 事件协议将鼠标事件通知给各个图形应用程序,该协议携带其他事件类型,例如按键、窗口焦点更改、窗口可见性更改……
归档时间: |
|
查看次数: |
32613 次 |
最近记录: |