Как 2 или более процессов взаимодействуют с клавиатурой? - PullRequest
3 голосов
/ 06 апреля 2009

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

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

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

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

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

Я знаю, что говорю в общих чертах. Я использую OS X.

1 Ответ

13 голосов
/ 06 апреля 2009

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

Это работает так.

Драйвер клавиатуры является частью операционной системы.

Диспетчер окон является привилегированным процессом, который получает устройство во время запуска. Оконный менеджер «владеет» устройством. Эксклюзивно.

  1. Прерывания отправляются в ОС.

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

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

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

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

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

...