我一直在考虑键盘处理问题。它是如何工作的?我似乎无法向我提出一个很好的解释。
我知道每按一次键就会产生键盘中断。处理器暂停处理的任何内容并从键盘缓冲区加载键盘数据,并将其存储在系统级缓冲区中。
但接下来会发生什么?我们来看一个实际的例子吧。当我运行以下代码时会发生什么:
...
std::string s;
std::cin >> s;
....
cin
是否从系统级键盘缓冲区的用户级别表示中读取?这在我的头脑中是完全合理的,因为那时2个或更多的进程可以从同一缓冲区读取,并且通过这种方式我不会松开任何按键。但这样做有用吗?
我知道我的谈话非常笼统。我正在使用的操作系统是OS X.
答案 0 :(得分:13)
除极少数情况外,您的键盘和显示器由Window Manager管理:X11,Gnome,KDE,Carbon,Cocoa或Windows。
就像这样。
键盘驱动程序是操作系统的一部分。
窗口管理器是一个特权进程,它在启动期间获取设备。窗口管理器“拥有”设备。独占。
中断进入操作系统。
操作系统通过排队响应中断。最终 - 当没有更高优先级的时候 - 它从中断中捕获键盘输入并缓冲它。
拥有进程(窗口管理器)正在读取此缓冲区。从此,它创建了键盘事件。
您的应用程序通过窗口管理器工作。
示例1 - 您正在运行命令行应用程序。在终端窗口。当终端窗口位于最前面时,窗口管理器在终端窗口处指示事件。键盘事件成为stdin流。
示例2 - 您正在运行GUI应用程序。在您自己的应用程序窗口中。当应用程序的窗口位于最前面时,窗口管理器会在应用程序窗口中指示事件。键盘事件可供您处理的各种GUI控件使用。某些键盘事件可能会在控件或活动按钮之间循环。