libudev监视在Raspbian上返回NULL指针

时间:2013-03-28 16:58:27

标签: c linux monitor udev raspbian

我正在尝试使用Raspbian将之前在Ubuntu系统上运行的应用程序移植到Raspberry Pi。应用程序应检测新的USB闪存驱动器。这就是udev监控的完成方式:

/* Create the udev object */
udev = udev_new();
if (!udev) {
    wprinterr("Can't create udev\n");
    exit(EXIT_FAILURE);
}
mon = udev_monitor_new_from_netlink(udev, "udev");
if(mon==NULL) {
    wprinterr("Could not create udev monitor!\n");
    exit(EXIT_FAILURE);
}
if(udev_monitor_filter_add_match_subsystem_devtype(mon, "block", NULL) != 0) {
    wprinterr("Could not add subsystem match to udev monitor\n");
    exit(EXIT_FAILURE);
}
if(udev_monitor_enable_receiving(mon) != 0) {
    wprinterr("Could not enable udev monitor receiving\n");
    exit(EXIT_FAILURE);
}
while (1) {
/*
* this will block until there is a monitor event
*/
    dev = udev_monitor_receive_device(mon);
    if (dev) {

这在Ubuntu机器上运行良好。但是在Raspberry Pi上,udev_monitor_receive_device(mon)会立即返回NULL指针。文档(Docu)表示在出现错误情况时会发生这种情况。 Errno设置为11(资源暂时不可用)。但我无法找到,出了什么问题。 udev守护程序正在运行btw。有人有什么想法吗?

前段时间我在Raspberry论坛上写过一个类似的问题,但没有得到答案,也找不到自己的解决方案。所以我再次在这里发布。 Link to Raspberry forum post

1 个答案:

答案 0 :(得分:0)

我没有找到解决方案,但我找到了解决方法。选择可用于阻止,直到有监视器事件。在此之后,udev_monitor_receie_device(mon)将返回一个指向设备的探针指针。

我可以这样做:

    mon = udev_monitor_new_from_netlink(udev, "udev");
    if(mon==NULL) {
        wprinterr("Could not create udev monitor!\n");
        exit(EXIT_FAILURE);
    }
    if(udev_monitor_filter_add_match_subsystem_devtype(mon, "block", NULL) != 0) {
        wprinterr("Could not add subsystem match to udev monitor\n");
        exit(EXIT_FAILURE);
    }
    if(udev_monitor_enable_receiving(mon) != 0) {
        wprinterr("Could not enable udev monitor receiving\n");
        exit(EXIT_FAILURE);
    }    
    fd = udev_monitor_get_fd(mon);
    while (1) {
        /*
         * this will block until there is a monitor event
         */
        fd_set fds;
        int ret;
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        ret = select(fd+1, &fds, NULL, NULL, NULL);

        /* Check if our file descriptor has received data. */
        if (ret > 0 && FD_ISSET(fd, &fds)) {
            dev = udev_monitor_receive_device(mon);
            if (dev) {