C libudev监控返回Raspbian上的空指针
我正在尝试使用Raspbian将以前在Ubuntu系统上运行的应用程序移植到Raspberry Pi。应用程序应该检测新的USB闪存驱动器。这就是udev监控的方式:C libudev监控返回Raspbian上的空指针,c,linux,monitor,udev,raspbian,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,
/* 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_监视器上,接收设备(mon)立即返回空指针。文档()说,如果出现错误情况,就会发生这种情况。Errno设置为11(资源暂时不可用)。但我不知道到底出了什么问题。udev守护进程正在运行。有人有什么想法吗
不久前,我在Raspberry论坛上写了一个类似的问题,但没有得到答案,自己也找不到解决办法。所以我又把它贴在这里了 我没有找到解决办法,但我找到了一个解决办法。选择可用于阻止,直到出现监视器事件。在此之后,udev\u监视器接收设备(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) {
udev\u monitor\u filter\u add\u match\u subsystem\u devtype()
和udev\u monitor\u enable\u receiving()
返回大于或等于0的整数。失败时,返回一个负错误代码。