2013-03-28 2 views
0

J'essaye de porter une application qui fonctionnait auparavant sur un système Ubuntu sur le Raspberry Pi, en utilisant Raspbian. L'application devrait détecter les nouvelles clés USB. Voici comment la surveillance udev est effectuée:libudev monitoring renvoie le pointeur NULL sur Raspbian

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

Cela fonctionne très bien sur la machine Ubuntu. Mais sur le Raspberry Pi udev_monitor_receive_device (mon) retourne immédiatement avec un pointeur NULL. La documentation (Docu) indique que cela se produit en cas de condition d'erreur. Errno est défini sur 11 (ressource temporairement indisponible). Mais je ne peux pas savoir, ce qui ne va pas. Le démon udev est en cours d'exécution btw. Quelqu'un a-t-il des idées?

J'ai écrit une question similaire sur le forum Raspberry il y a quelques temps mais je n'ai pas eu de réponse et je n'ai pas trouvé de solution moi-même. Alors je l'ai posté ici encore. Link to Raspberry forum post

Répondre

0

Je n'ai pas trouvé de solution, mais j'ai trouvé une solution de contournement. Select peut être utilisé pour bloquer jusqu'à ce qu'il y ait un événement de surveillance. Après cela, udev_monitor_receie_device (mon) retournera avec un pointeur prober sur un périphérique.

je peux être fait comme ceci:

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