linux使用udev检测usb热插拔的代码例子
时间: 2024-05-16 07:16:59 浏览: 242
下面是使用udev检测USB热插拔的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <libudev.h>
int main()
{
struct udev *udev = udev_new(); // 创建udev实例
if (!udev) {
perror("udev_new");
exit(1);
}
struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, "udev"); // 创建监视器,监听udev事件
udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", NULL); // 监视usb设备
udev_monitor_enable_receiving(mon); // 开始接收udev事件
while (1) {
fd_set fds;
FD_ZERO(&fds);
FD_SET(udev_monitor_get_fd(mon), &fds); // 将udev监视器的文件描述符加入到文件描述符集合中
// 等待事件的发生
if (select(udev_monitor_get_fd(mon) + 1, &fds, NULL, NULL, NULL) > 0) {
if (FD_ISSET(udev_monitor_get_fd(mon), &fds)) {
struct udev_device *dev = udev_monitor_receive_device(mon); // 获取udev事件对应的设备信息
if (dev) {
const char *action = udev_device_get_action(dev); // 获取事件类型
const char *devnode = udev_device_get_devnode(dev); // 获取设备节点
const char *vendor = udev_device_get_property_value(dev, "ID_VENDOR_FROM_DATABASE"); // 获取设备的制造商信息
const char *product = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE"); // 获取设备的型号信息
printf("Action: %s\n", action);
printf("Device Node Path: %s\n", devnode);
printf("Vendor: %s\n", vendor);
printf("Product: %s\n\n", product);
udev_device_unref(dev); // 释放设备信息占用的资源
}
}
}
}
udev_monitor_unref(mon); // 释放udev监视器占用的资源
udev_unref(udev); // 释放udev实例占用的资源
return 0;
}
```
这个代码会不断地监听udev事件,当有USB设备插入或拔出时,就会打印出相应的信息。
阅读全文