UDEV之USB检测

main.cpp

#include <stdio.h>
#include  "monitorusb.h"

int main()
{
    monitorusb* m_monitor = new monitorusb;
    m_monitor->run();
    return 0;
}

monitorusb.h

#ifndef MONITORUSB_H
#define MONITORUSB_H
#include <libudev.h>
#include <thread.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>


class monitorusb
{
public:
    monitorusb();
    void run();
private:
    struct udev *udev;
    struct udev_enumerate *enumerate;
    struct udev_list_entry *devices, *dev_list_entry;
    struct udev_device *dev;
    struct udev_monitor *mon;
    int fd;
};

#endif // MONITORUSB_H

monitorusb.cpp

#include "monitorusb.h"


monitorusb::monitorusb()
{
    udev = udev_new();
    if (!udev) {
        printf("error!!!\n");
    }
    mon = udev_monitor_new_from_netlink(udev, "udev");
    udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", NULL);
    udev_monitor_enable_receiving(mon);
    fd = udev_monitor_get_fd(mon);
    enumerate = udev_enumerate_new(udev);
    udev_enumerate_add_match_subsystem(enumerate, "usb");
    udev_enumerate_scan_devices(enumerate);
    devices = udev_enumerate_get_list_entry(enumerate);
    udev_list_entry_foreach(dev_list_entry, devices) {
        const char *path;
        path = udev_list_entry_get_name(dev_list_entry);
        dev = udev_device_new_from_syspath(udev, path);

        dev = udev_device_get_parent_with_subsystem_devtype(
                    dev,
                    "usb",
                    "usb_device");
        if (!dev) {
            printf("Unable to find parent usb device.");
            fflush(stdout);
        }

        udev_device_unref(dev);
    }
    udev_enumerate_unref(enumerate);
}

void monitorusb::run()
{
    char buf[10];
    char buf_devpath[50];
    fd_set fds;
    struct timeval tv;
    int ret;
    while (true) {
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        tv.tv_sec = 0;
        tv.tv_usec = 0;

        ret = select(fd+1, &fds, NULL, NULL, &tv);
        if (ret > 0 && FD_ISSET(fd, &fds)) {
            dev = udev_monitor_receive_device(mon);
            if (dev) {
                strcpy(buf_devpath, udev_device_get_devpath(dev));
                strcpy(buf, udev_device_get_action(dev));
                fflush(stdout);
                printf("   Action: %s\n", udev_device_get_action(dev));
                fflush(stdout);
                udev_device_unref(dev);
            }
            else {
                printf("No Device from receive_device(). An error occured.\n");
                fflush(stdout);
            }
        }
        sleep(1);
        printf(".");
        fflush(stdout);
    }
    udev_unref(udev);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值