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