LINUX.ORG.RU

Слежение за изменениями состояния питания

 ,


0

3

Есть такая штука /sys/class/power_supply/ и в ней состояния питания от сети и от батареи. Есть ли возможность следить за событиями оттуда, кроме как вручную читать эти файлы раз в секунду? Если какой-то готовый демон уже занимается чтением раз в секунду и создаёт на этой основе события - это не в счёт, это тоже ручное чтение, речь идёт именно про ядерное API.

acpi_listen ничего не показывает на втыкание/вытыкание питания

Нашёл тут https://unix.stackexchange.com/questions/227918/system-event-on-ac-adapter-in... советы запустить `udevadm monitor`, он тоже ничего не показывает.

★★★★★

Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от RussianWarShip

Всё что видит acpid - показывается в acpi_listen т.е. он ничего не видит

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)

Есть такая штука /sys/…

Есть ли возможность следить за событиями оттуда, кроме как вручную читать эти файлы раз в секунду?

речь идёт именно про ядерное API.

Полагаю, в данном случае это будет poll (2).

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

На кого poll? Если что это системный вызов для ожидания новых данных в сокете или пайпе. По указанным путям ни того ни того нет, только текстовые файлы.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

Для атрибутов sysfs тоже подойдёт.

Я использовал poll() для «опроса» gpio/value по событию POLLPRI. Событие POLLERR тоже можно предусмотреть. Ну а по выходу из poll() по событию просто проверяешь его код возврата и читаешь значение из атрибута.

Или тебе более высокоуровнево надо? Тогда не знаю. Не думаю, что в ядре есть прям API для событий питания, но могу ошибаться.

UPD: хотя, сейчас вспомнил, что в gpio/value эти события специально поддерживаются. В других атрибутах такого может и не быть.

Да, сомнительный метод.

apt_install_lrzsz ★★★
()
Последнее исправление: apt_install_lrzsz (всего исправлений: 1)

udevadm monitor ничего не показывает

Не воспроизводится. У меня при втыкании/вытыкании зарядки ловятся события

ACTION=="change", KERNEL=="AC", SUBSYSTEM=="power_supply", ATTR{online}=="1"

ACTION=="change", KERNEL=="AC", SUBSYSTEM=="power_supply", ATTR{online}=="0"

Напишите, какое оборудование и покажите выхлоп udevadm monitor при втыкании/вытыкании зарядки.

i586 ★★★★★
()
Ответ на: комментарий от apt_install_lrzsz

Или тебе более высокоуровнево надо?

Мне любой способ чтобы в юзерспейсе вообще никакой код не выполнялся до тех пор пока ядро не сообщит что что-то изменилось. poll надо будет проверить раз уж так.

firkax ★★★★★
() автор топика
Ответ на: комментарий от i586

Lenovo B50

udevadm monitor ничего не показывает вообще, ну только своё стартовое сообщение

monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

на втыкание флешки вот такое пишет

KERNEL[1999576.099556] add      /devices/pci0000:00/0000:00:14.0/usb2/2-1 (usb)
и потом с задержкой ещё пачку всякого

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от apt_install_lrzsz
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <poll.h>
int main(int argc, char **argv) {
  struct pollfd pfd;
  int r;
  char buf[100];
  pfd.fd = open(argv[1],O_RDONLY);
  read(pfd.fd,buf,sizeof(buf));
  printf("%d\n",pfd.fd);
  pfd.events = POLLPRI;
  while(1) {
    r = poll(&pfd,1,-1);
    printf("%d %d %d %d\n", r, pfd.revents, pfd.revents & POLLPRI, pfd.revents &POLLERR);
    sleep(1);
  }
  return 0;
}

Ждёт бесконечно. Если убрать read() то выдаёт POLLPRI|POLLERR постоянно.

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

Я, как добавил выше, не могу гарантировать, что на конкретно твоём атрибуте будет корректно работать poll(). Но всё равно не забывай сбрасывать поле revents в ноль перед вызовом poll().

apt_install_lrzsz ★★★
()
Ответ на: комментарий от apt_install_lrzsz

Ну это тестовый пример, тут ещё и errno нигде не проверяется например. Да и судя по ману старое содержимое revents ни на что не влияет, в том числе на новое его значение после успешного poll(). А я выложил не в качестве спора а в качестве уточнения информации.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от faq2

В мане по inotify написано что proc и sys не работает.

firkax ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.