【问题标题】:How does 2 or more processes interact with the keyboard?2 个或更多进程如何与键盘交互?
【发布时间】:2010-10-17 16:56:37
【问题描述】:

我一直在考虑如何处理键盘。它是如何工作的?我似乎无法用谷歌搜索我的解释。

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

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

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

cin 是否从系统级键盘缓冲区的用户级表示中读取?这在我的脑海中非常有意义,因为那时可以从同一个缓冲区读取 2 个或更多进程,这样我就不会松开任何按键。但它是这样工作的吗?

我知道我说的是非常笼统的术语。我使用的操作系统是 OS X。

【问题讨论】:

    标签: c++ keyboard kernel buffering


    【解决方案1】:

    除了在极少数情况下,您的键盘和显示器由窗口管理器管理:X11、Gnome、KDE、Carbon、Cocoa 或 Windows。

    它是这样工作的。

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

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

    1. 中断转到操作系统。

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

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

    您的应用程序通过窗口管理器运行。

    示例 1 -- 您正在运行一个命令行应用程序。在终端窗口中。当终端窗口位于最前面时,窗口管理器将事件定向到终端窗口。键盘事件成为标准输入流。

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

    【讨论】:

    • 所以 WM 拥有键盘。操作系统处理中断并将缓冲区从内核级别复制到 WM 处理缓冲区的用户级别。 WM 处理不同应用程序的事件,确保我在键盘上写的内容显示在文本应用程序中?
    • 嗯,更准确地说,窗口服务器(X11、Cocoa 或 Win32)将消息传递到带有击键信息的焦点窗口。输入缓冲区部分由输入驱动程序实现,并由窗口服务器简单地读取。应用看到的只是窗口消息。
    • 啊,好吧。我只是想知道不同的进程是如何从键盘缓冲区读取的,但我现在可以看到窗口服务器做到了。你们中有人有一些描述这种机制的论文的链接吗?
    • 阅读 X11、KDE ​​或 Gnome 的源代码。说真的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多