我正面临libudev的某个问题。我写了一个监听器线程,不断监听通过usb连接的设备。我在一个连续的while循环开始时使用了libudev API udev_monitor_receive_device,因为它是一个阻塞调用。源代码可以与libudev v1.6.3一起使用,但是当升级到v1.7.2时,对udev_monitor_receive_device的调用不再阻塞,而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")));
}
这个问题长期困扰着我。任何帮助将不胜感激。
答案 0 :(得分:1)
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;
}
如果receive_device在数据准备就绪之前仍然被阻止,而不是让你跳这个舞会,那就太好了。但是你去了。
答案 1 :(得分:0)
请参阅API reference:
默认情况下,监视器套接字设置为NONBLOCK。 udev_monitor_get_fd()返回的文件描述符上的poll()变体应该用于在新设备到达时唤醒,或者文件描述符切换到阻塞模式。