Як працюють події миші в Linux?


25

Це в основному з цікавості, я намагаюся зрозуміти, як працює подія на низькому рівні, тому, будь ласка, не посилайтеся на мене на програмне забезпечення, яке буде робити це для мене.

Якщо, наприклад, я хочу написати програму на C / C ++, яка реагує на клацання миші, я вважаю, що мені потрібно використовувати системний виклик, щоб підключити якусь функцію до ядра, або, можливо, вам потрібно просто постійно перевіряти стан миші, Не знаю.

Я припускаю, що це можливо, оскільки майже все можливо в C / C ++, будучи настільки низьким рівнем, що мене здебільшого цікавить, як це працює, хоча мені, мабуть, ніколи не доведеться це самостійно реалізовувати.

Питання в тому, як це працює в Linux, чи є певні системні виклики, c бібліотеки тощо?

Відповіді:


28

Якщо ви пишете програму в реальному світі, яка використовує мишу в Linux, ви, швидше за все, пишете додаток X, і в такому випадку вам слід запитати X-сервер про події миші. Qt , GTK і libsdl - деякі популярні бібліотеки С, які надають функції доступу до миші, клавіатури, графіки, таймерів та інших функцій, необхідних для написання програм GUI. Ncurses - це аналогічна бібліотека для термінальних додатків.

Але якщо ви вивчаєте свою систему або не можете використовувати X з будь-якої причини, ось як це працює в інтерфейсі ядра.

Основна ідея філософії UNIX полягає в тому, що "все є файлом". Більш конкретно, якомога більше речей повинно бути доступним через ті самі системні дзвінки, які ви використовуєте для роботи з файлами. І тому інтерфейс ядра до миші - це файл пристрою. Ви open()його, за бажанням, зателефонуйте poll()або select()перевірте, чи є вхідні дані, і read()прочитати дані.

Під час попереднього USB, конкретний файл пристрою часто послідовний порт, наприклад /dev/ttyS0, або / 2 порти PS, /dev/psaux. Ви говорили з мишею, використовуючи будь-який апаратний протокол, який був вбудований у мишу. У ці дні /dev/input/*є перевагою підсистема, оскільки вона забезпечує єдиний, незалежний від пристрою спосіб обробки багатьох різних пристроїв введення. Зокрема, /dev/input/miceбуде подано події від будь-якої миші, приєднаної до вашої системи, та /dev/input/mouseNподасть вам події від конкретної миші. У більшості сучасних дистрибутивів Linux ці файли створюються динамічно під час підключення миші.

Для отримання додаткової інформації про те, що саме ви читали б або записували у файл пристрою миші, ви можете почати з вводу / вводу.txt в документації на ядро. Перегляньте, зокрема, розділи 3.2.2 (mousedev) та 3.2.4 (evdev), а також розділи 4 та 5.


8

Як правило, інформація з апаратних пристроїв піддається впливу програм через файли пристроїв . Для мишей у сучасних системах Linux пристрій є /dev/mice(цей пристрій збирає події з усіх підключених мишей, також є пристрої, відповідні кожній окремій миші).

Коли ви рухаєтесь або клацаєте мишкою, миша надсилає електричний сигнал на комп’ютер, через що він викликає переривання . Шматок коду в ядрі Linux, який називається обробником переривання, в свою чергу зчитує дані про події (наприклад, яку кнопку було натиснуто) і запускає ланцюжок сповіщень всередині ядра.

Якщо є програма, яка зчитує файл файлу пристрою, відповідний цьому пристрою, цій програмі повідомляється, що вхід чекає. Наприклад, якщо програма заблокована в aread системного дзвінка , тоді системний виклик повертається.

У типовій системі є один процес читання подій мишей: сервер X Window . Ця програма управляє графічним дисплеєм та вхідною периферією. Потім окремі графічні програми повідомляються про події миші за допомогою загального протоколу X події, який містить інші типи подій, такі як натискання клавіш, зміна фокусу вікна, зміна видимості вікон…

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.