2009-04-05 2 views
3

Я много думал о клавиатуре. Как это работает? Кажется, я не могу объяснить вам хорошее объяснение.Как взаимодействует 2 или более процессов с клавиатурой?

Я знаю, что прерывание клавиатуры выполняется каждый раз при нажатии клавиши. Процессор останавливает все, что он обрабатывает, и загружает данные клавиатуры из буфера клавиатуры, сохраняя его в буфере уровня системы.

Но что будет дальше? Давайте рассмотрим практический пример. Что происходит, когда я запускаю следующий фрагмент кода:

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

читать ли cin из представления на уровне пользователя буфера клавиатуры системного уровня? Это имеет смысл в моей голове, потому что тогда 2 или более процесса могут считывать из одного и того же буфера, и таким образом я не теряю никаких нажатий клавиш. Но работает ли это так?

Я знаю, что говорю в самых общих чертах. Используемая ОС - OS X.

ответ

12

За исключением редких ситуаций, клавиатура и дисплей управляются диспетчером окон: X11, Gnome, KDE, Carbon, Cocoa или Windows.

Это работает именно так.

Драйвер клавиатуры является частью ОС.

Диспетчер окон - это привилегированный процесс, который приобретает устройство во время запуска. Диспетчер окон «владеет» устройством. Исключительно.

  1. Прерывания идут в ОС.

  2. ОС отвечает прерывания очередью. В конце концов - когда нет ничего более высокого приоритета - он захватывает ввод с клавиатуры из прерывания и буферизирует его.

  3. Процесс хранения (оконный менеджер) читает этот буфер. Из этого он создает события клавиатуры.

Ваше приложение работает через оконного менеджера.

Пример 1 - Вы используете приложение из командной строки. В окне терминала. Когда окно терминала самое главное, диспетчер окон направляет события в окне терминала. События клавиатуры становятся потоком stdin.

Пример 2 - вы используете GUI-приложение. В окне вашего собственного приложения. Когда окно вашего приложения является самым большим, диспетчер окон напрямую управляет событиями в окне вашего приложения. События клавиатуры доступны для обработки различных элементов управления графическим интерфейсом. Некоторые события клавиатуры могут переключаться между элементами управления или активными кнопками.

+0

Таким образом, WM владеет клавиатурой. ОС обрабатывает прерывания и копирует буфер с уровня ядра на уровень пользователя, где WM обрабатывает буфер. WM обрабатывает события для разных приложений, убедившись, что все, что я пишу на клавиатуре, показано в текстовом приложении? – mslot

+0

Ну, вернее, оконный сервер (X11, Cocoa или Win32) передает сообщения в сфокусированное окно, которые несут информацию нажатия клавиши. Входной буфер частично реализуется драйвером ввода и просто считывается сервером окон. Все приложения видят оконные сообщения. – greyfade

+0

Ах ладно. Мне просто интересно, как разные процессы читаются из буфера клавиатуры, но теперь я вижу, что это делает сервер окон.У кого-то из вас есть ссылки на документы, описывающие этот механизм? – mslot

Смежные вопросы