【问题标题】:how does keyboard input reach the right virtual terminal in GUI键盘输入如何在 GUI 中到达正确的虚拟终端
【发布时间】:2012-07-17 03:26:15
【问题描述】:
假设我们有一个运行 linux 的 8 核系统,您正在使用 GUI 桌面并打开 10-20 个终端。
当您键入内容时,用户输入会显示在正确的终端上。怎么会这样。例如,键盘中断可以到达任何 cpu,它如何路由到正确的进程是我的问题(假设一次有 10 个进程正在等待用户输入)
这是我所知道的:
键盘驱动程序将有一个中断处理程序,它读取输入并将其复制到可能由某些高优先级工作队列处理的缓冲区。 (没必要,但我觉得会发生这种情况)
必须将此缓冲区复制到当前活动 shell 的标准输入文件描述符的缓冲区中。
我不知道的事情
工作队列工作函数如何确定哪个进程正在运行当前活动的 shell。
【问题讨论】:
标签:
operating-system
linux-kernel
linux-device-driver
【解决方案1】:
工作队列函数不能确定哪个进程正在运行——这是在更高级别上完成的。键盘设备由内核通过/dev/input/ 中的设备文件导出(在我的系统上是/dev/input/event3 - 您可以查看/dev/input/by-id 以查看哪个对应于您的键盘)。 X 服务器打开此设备文件以接收事件(在/var/log/Xorg.0.log 中查找设备文件以查看发生这种情况的位置)。 X 服务器因此接收所有键盘事件并将它们分派给正确的客户端本身。知道了哪个窗口有焦点,就可以将对应的输入事件放入客户端队列队列中,并向对应的进程发送信号,该进程被唤醒,可以处理该事件。
有关更多信息,请参阅http://en.wikipedia.org/wiki/Evdev 和相关链接。
【解决方案2】:
它只是知道。所有进程之一被标记为当前用于控制台 I/O。你切换到另一个,另一个被标记为当前。我不知道实现的细节,但就是这样。