2010-11-19 32 views

Répondre

4

udev (Gestionnaire de périphériques Linux) est celui qui matériel de sondages. Lorsqu'il détecte des modifications sur les périphériques, il exécute la règle associée.

Vous devez ajouter une règle à udev, afin d'informer votre programme sur l'insertion du retrait du clavier USB. Vous pouvez trouver de la documentation sur les règles udev here ou sur Rechercher des fichiers dans /etc/udev/rules.d/ ou /lib/udev/rules.d/ pour trouver de nombreux exemples.

+0

Rien de plus simple que de surveiller les modifications matérielles ne doit pas être si difficile et ne nécessite pas de privilèges root. Voir ma réponse ci-dessous comment faire cela en utilisant DBus et HAL. – abbot

-2

Si le démon HAL est en cours d'exécution (ce qui est vrai pour la plupart des postes de travail Linux modernes), vous pouvez écouter ses signaux DBus. Voici un exemple pour détecter si une souris USB est branché (je n'ai pas un clavier USB à portée de main):

import gobject 
import dbus 
from dbus.mainloop.glib import DBusGMainLoop 

DBusGMainLoop(set_as_default=True) 
bus = dbus.SystemBus() 
# enumerate all present mice: 
manager = dbus.Interface(bus.get_object("org.freedesktop.Hal", 
             "/org/freedesktop/Hal/Manager"), 
         "org.freedesktop.Hal.Manager") 
mice = set(manager.FindDeviceByCapability('input.mouse')) 

def device_added(sender): 
    dev = dbus.Interface(bus.get_object("org.freedesktop.Hal", sender), 
         "org.freedesktop.Hal.Device") 
    try: 
     caps = dev.GetProperty('info.capabilities') 
     if 'input.mouse' in caps: 
      print "mouse plugged in" 
      mice.add(sender) 
    except dbus.DBusException: 
     pass 

def device_removed(sender): 
    if sender in mice: 
     print "mouse unplugged" 
     mice.remove(sender) 

bus.add_signal_receiver(device_added, signal_name="DeviceAdded") 
bus.add_signal_receiver(device_removed, signal_name="DeviceRemoved") 

loop = gobject.MainLoop() 
loop.run() 
+2

HAL est obsolète depuis plus d'un an maintenant. – ephemient

+0

En fait HAL est obsolète et n'est plus maintenu en faveur de udev; seules les applications obsolètes l'utilisent. Je suis d'accord, cependant, que votre solution est plus simple que la mienne et ne nécessite pas d'accès root. Je ne sais pas s'il est possible de faire quelque chose comme ça avec des outils non obsolètes, mais HAL devrait être évité. – peoro

+0

HAL peut être déprécié, mais son DeviceKit de remplacement est très pauvre à certains égards. Citant Wiki X.Org, "Ni DeviceKit, ni les remplacements udisks/upower/etc ne fournissent aucune de ces fonctionnalités pour les périphériques d'entrée, et les auteurs DeviceKit ont indiqué qu'ils ne prévoient pas de fournir une telle fonctionnalité, suggérant une utilisation directe du système d'exploitation des interfaces telles que libudev à la place. " Je continuerais à utiliser HAL pour ces fonctions, car il est toujours inclus dans la plupart des distributions. – abbot

2

udevadm monitor (le binaire d'administration udev) ou udev_monitor (en libudev).

Alternativement, si vous utilisez X11 avec le branchement à chaud d'entrée, vous pouvez écouter l'événement d'extension XI DevicePresenceNotify.