Как зарегистрироваться на uevent из пользовательского приложения в Linux?

Я написал драйвер батареи, и этот драйвер отправляет uevent при изменении источника питания, то есть с переменного тока на батарею.

Когда я запускаю udevadm monitor, я вижу события KERNEL и UDEV CHANGE из подсистемы power_supply после отключения питания переменного тока.

Мое требование состоит в том, чтобы уведомлять пользовательское приложение, когда происходит событие CHANGE из подсистемы power_supply. Я не хочу запрашивать сообщение ядра или сокет netlink из пользовательского приложения.

Могу ли я зарегистрироваться/прослушать этот конкретный uevent из пользовательского приложения и получить что-то вроде функции обратного вызова при возникновении события?


person Raxesh Oriya    schedule 27.08.2020    source источник


Ответы (1)


Это возможно, и есть отличная ссылка здесь. В справке они используют правило изменения для аналогичного приложения:

# Rule for when switching to battery
ACTION=="change", SUBSYSTEM=="power_supply", ATTR{type}=="Mains", ATTR{online}=="0", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/USERNAME/.Xauthority" RUN+="/usr/bin/su USERNAME_TO_RUN_SCRIPT_AS -c /usr/local/bin/brightness_notification.sh"

ACTION=="change" регистрирует правило для события изменения. Параметры SUBSYSTEM и ATTR указывают, что правило должно применяться только к определенному устройству или устройствам (вы можете получить их для своего устройства от udevadm). Параметр RUN — это то, как вы запускаете исполняемый файл пользовательского пространства при появлении события. В приведенном ниже случае они также используют параметр ENV для передачи переменной среды в исполняемый файл, а также используют команду su в RUN для запуска исполняемого файла от имени другого пользователя, но это, вероятно, не требуется для большинства приложений.

person Liam Kelly    schedule 27.08.2020