2013-03-28 24 views
0

我正尝试使用Raspbian将在Ubuntu系统上运行的应用程序移植到Raspberry Pi上。应用程序应检测新的USB闪存驱动器。这是如何完成udev监测:libudev监控在Raspbian上返回NULL指针

/* 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守护进程正在运行。有人有些想法吗?

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

回答

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) {