udev - изменить событие с udev_device_get_action

818
amitam

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

Я использую функцию, предоставляемую linux udev_device_get_action, которая используется для получения событий / действий на этом устройстве.

На моей машине я постоянно получаю события изменения, возвращаемые этой функцией в переменную моего кода. [Возвращает указатель на символ]

Я проверил код Linux для функции udev_device_get_action, она просто возвращает действие из структуры устройства udev.

UDEV_EXPORT const char *udev_device_get_action(struct udev_device *udev_device) { if (udev_device == NULL) return NULL; return udev_device->action; } 

Итак, как я могу знать, откуда именно происходят эти изменения?

0

1 ответ на вопрос

1
grawity

события генерируются самим ядром (то есть драйверами ядра).

udev получает их по  netlink (7), используя семейство NETLINK_KOBJECT_UEVENT, группа 1. Затем он добавляет различные дополнительные поля из правил & hwdb и повторно передает расширенные события в группу 2 kobject-uevent, где libudev наконец получает их.

Можно запускать события вручную (например, записывая «add» или «change» в /sys/…/ueventфайл данного устройства ), но обычно это не делается, за исключением использования «udevadm trigger».

Но в чем смысл CHANGE_EVENTS, который я часто получаю от udevd ..? В моем драйвере я позаботился о событиях UDEV для устройств ADD, REMOVE, ONLINE, OFFLINE для устройств, но у меня нет цели, а скорее поведение за прослушиванием CHANGE_EVENTS. Какова причина этого и что будет использовать его для любого блочного драйвера? amitam 8 лет назад 0