2个或更多进程如何与键盘交互?

时间:2009-04-05 20:39:37

标签: c++ keyboard kernel buffering

我一直在考虑键盘处理问题。它是如何工作的?我似乎无法向我提出一个很好的解释。

我知道每按一次键就会产生键盘中断。处理器暂停处理的任何内容并从键盘缓冲区加载键盘数据,并将其存储在系统级缓冲区中。

但接下来会发生什么?我们来看一个实际的例子吧。当我运行以下代码时会发生什么:

...
std::string s;
std::cin >> s;
....

cin是否从系统级键盘缓冲区的用户级别表示中读取?这在我的头脑中是完全合理的,因为那时2个或更多的进程可以从同一缓冲区读取,并且通过这种方式我不会松开任何按键。但这样做有用吗?

我知道我的谈话非常笼统。我正在使用的操作系统是OS X.

1 个答案:

答案 0 :(得分:13)

除极少数情况外,您的键盘和显示器由Window Manager管理:X11,Gnome,KDE,Carbon,Cocoa或Windows。

就像这样。

键盘驱动程序是操作系统的一部分。

窗口管理器是一个特权进程,它在启动期间获取设备。窗口管理器“拥有”设备。独占。

  1. 中断进入操作系统。

  2. 操作系统通过排队响应中断。最终 - 当没有更高优先级的时候 - 它从中断中捕获键盘输入并缓冲它。

  3. 拥有进程(窗口管理器)正在读取此缓冲区。从此,它创建了键盘事件。

  4. 您的应用程序通过窗口管理器工作。

    示例1 - 您正在运行命令行应用程序。在终端窗口。当终端窗口位于最前面时,窗口管理器在终端窗口处指示事件。键盘事件成为stdin流。

    示例2 - 您正在运行GUI应用程序。在您自己的应用程序窗口中。当应用程序的窗口位于最前面时,窗口管理器会在应用程序窗口中指示事件。键盘事件可供您处理的各种GUI控件使用。某些键盘事件可能会在控件或活动按钮之间循环。