deamon für usb

Post Reply
Message
Author
User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

deamon für usb

#1 Post by killerhippy »

Hi,

welche systemschonende Programmierung kann mir hier jemand empfehlen für einen deamon, der folgendes leistet:

- Keine Aktionen bis ein bestimmtes Gerät am USB Bus angeschlossen ist.

dbus, hal, glib-2-0, udev?

Als C Neuling blicke ich da noch nicht durch, was ich nehmen sollte, weil ich nicht beurteilen kann, was am besten wäre. Ausprobieren konnte ich bisher nur das udev Beispiel udev_example.c von http://www.signal11.us/oss/udev/
Beispielprogramme der anderen Kandiaten habe ich nicht kompilieren können und vor allem steige ich da nicht durch, weil ich keine weiteren Beispielcode finden konnte und ein Referenz Handbuch ist mir ein Buch mit sieben Siegeln
Es gibt keine dumme Fragen!

Killerhippy

ElBlues
Posts: 127
Joined: 25. Mar 2008 12:50
Contact:

#2 Post by ElBlues »

http://www.kaufkauf.net - nie wieder Einkäufe vergessen!

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#3 Post by Janka »

Für Dbus brauchst du beides. Udev-Skripte, um die dbus-Events auszulösen, und eine GUI-Applikation, die diese Events dann empfängt. Du kannst aber existierende Udev-Skripte benutzen, um die Events erzeugen zu lassen, wenn dich die Applikations-Seite interessiert oder halt nur das Udev-Skript machen, wenn du keine neue Applikation entwickeln, sondern eine existierende Applikation für neue Events nutzen willst. Oder du lässt dbus aus und arbeitest nur mit udev.

Für Gnome gilt das entsprechend. Und HAL stirbt. Darauf solltest du also nicht setzen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

#4 Post by killerhippy »

Danke für die Antworten. Das Udev Beispiel konnte ich in meinen deamon soweit um- und einbauen, dass es funktioniert. Jedoch stört mich daran:

- Systemload steigt, der Prozess verbraucht viel CPU Zeit schon beim Warten darauf, dass etwas passiert.

Blöde Frage vielleicht, von dbus hatte ich mir eigentlich erwartet, ich sage dem Bescheid, worauf er achten soll und dann schickt er mir ein Signal, wenn das eintritt.

Wenn das nicht so funktioniert, kann ich ja besser 1 mal in der Sekunde oder so /proc/bus/usb/devices nach meinem Gerät greppen.
Es gibt keine dumme Fragen!

Killerhippy

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#5 Post by Janka »

killerhippy wrote:Danke für die Antworten. Das Udev Beispiel konnte ich in meinen deamon soweit um- und einbauen, dass es funktioniert. Jedoch stört mich daran:

- Systemload steigt, der Prozess verbraucht viel CPU Zeit schon beim Warten darauf, dass etwas passiert.
Das sollte nicht so sein und spricht dafür, dass das Beispiel einen Fehler enthält oder veraltet ist. Link?

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

#6 Post by killerhippy »

http://www.signal11.us/oss/udev/

Unten auf der Seite habe ich
Set up a monitor to monitor hidraw devices
angepasst auf usb u. usbdevice und in meinen deamon eingebaut, das läuft da also in einer Endlos Schleife.
Funktioniert aber man darf z B. keine Sleeps einbauen sonst wird das Entfernen des devices nicht mehr bemerkt.

Inzwischen habe ich ein C Grep von
http://page.mi.fu-berlin.de/kijewski/so ... c,cat.html
testweise eingebaut, das funktioniert soweit und ich bin (erstmal) begeistert. Im top ist es gar nicht zu sehen:

Code: Select all

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                   
 2837 sascha    20   0 10280  784  648 S    0  0.0   0:00.57 spf87hd 
Von der cmd line:

Code: Select all

SPF87H in Monitor Mode found
claimed device
Send_cmd finished.
SPF-87H device gone
SPF87H in Monitor Mode found
claimed device
Send_cmd finished.
SPF-87H device gone
SPF87H in Monitor Mode found
Error opening device handle
SPF87H in Monitor Mode found
claimed device
Send_cmd finished.
SPF-87H device gone
Wiederholtes aktivieren u. ausschalten. Läuft :D

Jedenfalls, solange das Programm auf dem terminal (foreground) läuft. Wenn ich es echt als deamon starte, bekomme ich einen Fehler, sobald es aktiv wird:

Code: Select all

Jan 27 03:36:29 localhost kernel: spf87hd[27606]: segfault at 10 ip 0000003d41009334 sp 00007fff3b326ba0 error 4 in libpthread-2.12.2.so[3d41000000+17000]
Jan 27 03:36:29 localhost kernel: spf87hd[27606]: segfault at 10 ip 0000003d41009334 sp 00007fff3b326ba0 error 4 in libpthread-2.12.2.so[3d41000000+17000]
Muss ich da beim komilieren noch irgendwie gegen pthread linken?
Mein Makefile sieht so aus:

Code: Select all

CC = gcc
CFLAGS = -Wall -O2 -g 
LDFLAGS = -lusb-1.0 

OBJ=spf87hd

all: $(OBJ)

spf87hd: spf87hd.o
        ${CC} ${CFLAGS} ${LDFLAGS} spf87hd.o -o spf87hd

spf87hd.o: spf87hd.c
        ${CC} ${CFLAGS} ${LDFLAGS} -c spf87hd.c

clean:
        rm -rf *.o spf87hd
Es gibt keine dumme Fragen!

Killerhippy

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#7 Post by Janka »

killerhippy wrote: Jedenfalls, solange das Programm auf dem terminal (foreground) läuft. Wenn ich es echt als deamon starte,
Ich vermute, dass in dem Programm die Rückgabewerte einer oder mehrerer Funktionen nicht auf den Fehlerzustand abgefragt werden und dann mit NULL weitergearbeitet wird -- was natürlich segfaulten wird.

Wie startest du es genau? Was genau ist dann anders als bei direktem start? So kommst du vermutlich des Stelle auf die Schliche, wo die Fehlerbehandlung fehlt.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

#8 Post by killerhippy »

Fast genau ins Schwarze getroffen.

Ich hatte einen Fehler gemacht, die Initialisierung vom libusb war durch ein Überbleibsel vergangener Debug Ausgaben nur in Nicht-Deamon Mode gemacht worden. Korrigiert, läuft:

Code: Select all

Jan 27 23:10:20 localhost spf87hd[9561]: spf87hd started
Jan 27 23:10:36 localhost kernel: usb 1-5: new high speed USB device using ehci_hcd and address 81
Jan 27 23:10:36 localhost kernel: usb 1-5: new high speed USB device using ehci_hcd and address 81
Jan 27 23:10:36 localhost spf87hd[9561]: SPF87H in Monitor Mode found
Jan 27 23:10:36 localhost spf87hd[9561]: claimed device
Jan 27 23:10:36 localhost spf87hd[9561]: Send_cmd finished.
Jan 27 23:10:58 localhost kernel: usb 1-5: USB disconnect, address 81
Jan 27 23:10:58 localhost kernel: usb 1-5: USB disconnect, address 81
Jan 27 23:10:58 localhost spf87hd[9561]: SPF-87H device gone
Danke! Jetzt noch die letzten Funktionen einbauen...
Es gibt keine dumme Fragen!

Killerhippy

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

#9 Post by killerhippy »

Ich habe fertig. Ist verfügbar auf http://www.killerhippy.de/archives/2011 ... demon.html
Wer mal gucken will...
Oder selbst dafür Verwendung hätte...
Es gibt keine dumme Fragen!

Killerhippy

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Update auf v0.0.2

#10 Post by killerhippy »

Für moderne Systeme, auf denen proc/bus/usb/devices nicht mehr exisitiert oder schlicht nicht gemountet ist, wird jetzt unter /sys/bus/usb/devices nach dem Gerät gesucht.
http://www.killerhippy.de/archives/2011 ... -v002.html
Es gibt keine dumme Fragen!

Killerhippy

Post Reply