199ca880aSopenharmony_ci# eudev
299ca880aSopenharmony_cieudev 是一个通用的内核设备管理器。它运行在用户空间, 在Linux 系统上作为守护程序运行,并侦听(通过 netlink 套接字)在初始化新设备或从系统中删除设备时内核发出的内容。通过其提供的规则与事件的导出值和发现设备的属性匹配,命名并创建设备节点,并运行已配置的程序来设置和配置设备。
399ca880aSopenharmony_ci
499ca880aSopenharmony_ci每当设备结构发生变化时,内核都会发出一个由设备管理器获取的 uevent ,然后设备管理器查找声明的规则,根据uevent中包含的信息,它会找到触发和执行所需操作所需的规则。这些动作可能涉及设备文件的创建或删除,还可能触发将特定固件文件加载到内核内存中。
599ca880aSopenharmony_ci
699ca880aSopenharmony_ci## 目录结构
799ca880aSopenharmony_ci
899ca880aSopenharmony_ci```
999ca880aSopenharmony_ciREADME.md               英文说明
1099ca880aSopenharmony_ciREADME_zh.md            中文说明
1199ca880aSopenharmony_ciCOPYING                 版权文件
1299ca880aSopenharmony_cihwdb/                   硬件数据库文件
1399ca880aSopenharmony_cirules.d/                规则文件
1499ca880aSopenharmony_ciexport_include/         导出头文件
1599ca880aSopenharmony_cisrc/                    C++源码
1699ca880aSopenharmony_citest/                   测试文件
1799ca880aSopenharmony_ciman/                    帮助文件
1899ca880aSopenharmony_ci```
1999ca880aSopenharmony_ci
2099ca880aSopenharmony_ci## OpenHarmony如何集成libudev
2199ca880aSopenharmony_ci### 1.头文件引入
2299ca880aSopenharmony_ci```cpp
2399ca880aSopenharmony_ci#include "libudev.h"
2499ca880aSopenharmony_ci```
2599ca880aSopenharmony_ci### 2.BUILD.gn添加引用
2699ca880aSopenharmony_ci```cpp
2799ca880aSopenharmony_cideps += [ "//third_party/eudev:libudev" ]
2899ca880aSopenharmony_ci```
2999ca880aSopenharmony_ci### 3.调用udev函数过程举例
3099ca880aSopenharmony_ci```cpp
3199ca880aSopenharmony_ci#include <stdio.h>
3299ca880aSopenharmony_ci#include "libudev.h"
3399ca880aSopenharmony_ci
3499ca880aSopenharmony_civoid test_device(struct udev *udev, const char *syspath)
3599ca880aSopenharmony_ci{
3699ca880aSopenharmony_ci    struct udev_device *device;
3799ca880aSopenharmony_ci    printf("looking at device: %s\n", syspath);
3899ca880aSopenharmony_ci    device = udev_device_new_from_syspath(udev, syspath);
3999ca880aSopenharmony_ci    if (device == NULL) {
4099ca880aSopenharmony_ci        printf("no device found\n");
4199ca880aSopenharmony_ci        return;
4299ca880aSopenharmony_ci    }
4399ca880aSopenharmony_ci    printf("*** device: %p ***\n", device);
4499ca880aSopenharmony_ci    const char *str = udev_device_get_devnode(device);
4599ca880aSopenharmony_ci    if (str != NULL) {
4699ca880aSopenharmony_ci        printf("devname:   '%s'\n", str);
4799ca880aSopenharmony_ci    }
4899ca880aSopenharmony_ci    dev_t devnum = udev_device_get_devnum(device);
4999ca880aSopenharmony_ci    if (major(devnum) > 0) {
5099ca880aSopenharmony_ci        printf("devnum:    %u:%u\n", major(devnum), minor(devnum));
5199ca880aSopenharmony_ci    }
5299ca880aSopenharmony_ci    udev_device_unref(device);
5399ca880aSopenharmony_ci}
5499ca880aSopenharmony_ci
5599ca880aSopenharmony_ciint main(int argc, char *argv[])
5699ca880aSopenharmony_ci{
5799ca880aSopenharmony_ci    struct udev *udev = udev_new();
5899ca880aSopenharmony_ci    printf("udev context: %p\n", udev);
5999ca880aSopenharmony_ci    if (udev == NULL) {
6099ca880aSopenharmony_ci        printf("no context\n");
6199ca880aSopenharmony_ci        return 1;
6299ca880aSopenharmony_ci    }
6399ca880aSopenharmony_ci    const char *path = "/sys/devices/virtual/mem/null";
6499ca880aSopenharmony_ci    test_device(udev, path);
6599ca880aSopenharmony_ci    udev_unref(udev);
6699ca880aSopenharmony_ci    return 0;
6799ca880aSopenharmony_ci}
6899ca880aSopenharmony_ci```
6999ca880aSopenharmony_ci
7099ca880aSopenharmony_ci## udev使用文档
7199ca880aSopenharmony_ci
7299ca880aSopenharmony_ci官方文档  https://github.com/eudev-project/eudev
7399ca880aSopenharmony_ci
7499ca880aSopenharmony_ci## COPYING
7599ca880aSopenharmony_ci
7699ca880aSopenharmony_ci见 [COPYING](COPYING).
77