2010-11-19 29 views

答えて

4

のudev(Linuxデバイスマネージャ)を一度ポーリングハードウェアです。デバイスに関するいくつかの変更を検出すると、関連付けられたルールが実行されます。

USBキーボードの取り外しの挿入についてプログラムに通知するには、udevにルールを追加する必要があります。 udevルールhereに関するドキュメント、または/etc/udev/rules.d/または/lib/udev/rules.d/のファイルを参照すると、多くの例が見つかります。

+0

ハードウェアの変更を監視するという単純なことは、それほど難しいものではなく、root特権を必要とする必要はありません。私の答えは、DBusとHALを使ってこれを行う方法を参照してください。 – abbot

-2

HALデーモンが実行されている場合(ほとんどの現代のLinuxデスクトップで当てはまります)、そのDBus信号を聞くことができます。

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は1年以上使用されなくなりました。 – ephemient

+0

実際には、HALは廃止され、もはやudevのために維持されません。時代遅れのアプリケーションだけがそれを使用します。しかし、あなたのソリューションは私のものより簡単であり、ルートアクセスを必要としないことに同意します。推奨されていないツールでも同様のことが可能かどうかは分かりませんが、HALは避けるべきです。 – peoro

+0

HALは廃止されることがありますが、DeviceKitの交換は一部の面では非常に貧弱です。 X.Org Wikiを引用する "DeviceKitやudisks/upower/etcの置換えは、入力デバイスにこのような機能を提供するものではなく、DeviceKitの作者は、そのような機能を提供する予定はなく、OSの直接使用を示唆している代わりにlibudevなどのインタフェースを使用してください。ほとんどのディストリビューションにはまだ含まれているので、私はこれらの関数にHALを使用し続けます。 – abbot

2

udevadm monitor(udevの管理バイナリ)または(libudev中)udev_monitor:ここではUSBマウスが接続されている場合(私は手元にUSBキーボードを持っていない)を検出する方法の例です。

入力ホットプラグでX11で実行している場合は、XI拡張イベントDevicePresenceNotifyを聞くことができます。

関連する問題