udev 监测插拔设备 C语言实现程序
时间: 2023-07-29 12:07:58 浏览: 202
以下是一个简单的 C 语言实现程序,用于监测 udev 插拔设备:
```c
#include <libudev.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
struct udev *udev;
struct udev_monitor *mon;
int fd;
udev = udev_new();
if (!udev) {
printf("Failed to create udev\n");
return 1;
}
mon = udev_monitor_new_from_netlink(udev, "udev");
udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", "usb_device");
udev_monitor_enable_receiving(mon);
fd = udev_monitor_get_fd(mon);
while (1) {
fd_set fds;
struct timeval tv;
int ret;
FD_ZERO(&fds);
FD_SET(fd, &fds);
tv.tv_sec = 1;
tv.tv_usec = 0;
ret = select(fd + 1, &fds, NULL, NULL, &tv);
if (ret > 0 && FD_ISSET(fd, &fds)) {
struct udev_device *dev = udev_monitor_receive_device(mon);
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");
if (action && devnode && vendor && product) {
printf("Device %s (%s %s) %s\n", devnode, vendor, product, action);
}
udev_device_unref(dev);
}
}
}
udev_monitor_unref(mon);
udev_unref(udev);
return 0;
}
```
该程序首先创建了一个 `udev` 对象,然后创建一个 `udev_monitor` 对象,并添加一个匹配 `usb` 子系统和 `usb_device` 设备类型的规则。接下来,程序启用接收功能并获取文件描述符。接下来,程序进入一个无限循环,调用 `select()` 函数阻塞等待事件,并在收到事件时处理设备变更。程序获取 `udev_device` 对象,并打印设备节点路径、设备制造商和产品信息以及设备行为。最后,程序释放相关资源并退出。
请注意,此程序仅用于演示目的,实际使用时可能需要添加更多的错误处理和异常情况处理。
阅读全文