我正面临着一个关于诽谤的问题。我写了一个监听线程,它不断地监听通过usb连接的设备。我使用libudev API udev_monitor_receive_设备开始一个连续的while循环,因为它是一个阻塞调用。源代码在libudev v1.6.3中运行良好,但是当升级到v1.7.2时,对udev_monitor_receive_设备的调用不再阻塞,while循环继续运行,api继续返回NULL。下面是代码的一部分,它将帮助您理解libudev在我的代码中的用法。。

struct udev *udevObject ;
struct udev_device *mDev;
struct udev_enumerate *enumerate;
struct udev_monitor *mUdevMonitorObject;

udevObject = udev_new();
if(NULL == udevObject){
    LOGERR((TEXT("Listener thread :: Error initialising Udev Library\r\n")));
    return false;
}
mUdevMonitorObject = udev_monitor_new_from_netlink(udevObject, "udev");
udev_monitor_enable_receiving(mUdevMonitorObject);
//    enumerate = udev_enumerate_new(udevObject);
//    udev_enumerate_scan_devices(enumerate);


while(1)
{
    // This loop keeps running continuously on libudev v1.7.3, but the call blocks for v1.6.3
    mDev = udev_monitor_receive_device(mUdevMonitorObject);
    LOGINFO((TEXT("Listener thread:: Processing UDEV trigger\r\n")));
}

这个问题困扰我很久了。任何帮助都将不胜感激。

最佳答案

是的,我也看到了同样的事情。似乎现在与udev_monitor_receive_设备交互的唯一方法是使用select/poll-我有一个类似的循环给您,在udev_monitor_receive_设备之前添加这些行可以使一切都变得合理:

int fd = udev_monitor_get_fd(mUdevMonitorObject);
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
if(select(fd+1, &fdset, NULL, NULL, NULL) < 0) {
    /* error in select */
    continue;
}

如果接收设备在数据准备好之前仍然被阻止,而不是让你跳这个舞,那就好了。

关于c++ - libudev怪异行为v1.7.2起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8418020/

10-11 03:36