deamon für usb

Antworten
Nachricht
Autor
Benutzeravatar
killerhippy
Beiträge: 529
Registriert: 19. Mai 2000 19:36
Kontaktdaten:

deamon für usb

#1 Beitrag von killerhippy » 26. Jan 2011 3:29

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
Beiträge: 127
Registriert: 25. Mär 2008 12:50
Kontaktdaten:

#2 Beitrag von ElBlues » 26. Jan 2011 12:26

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

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#3 Beitrag von Janka » 26. Jan 2011 13:26

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.

Benutzeravatar
killerhippy
Beiträge: 529
Registriert: 19. Mai 2000 19:36
Kontaktdaten:

#4 Beitrag von killerhippy » 26. Jan 2011 22:56

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

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#5 Beitrag von Janka » 26. Jan 2011 23:23

killerhippy hat geschrieben: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.

Benutzeravatar
killerhippy
Beiträge: 529
Registriert: 19. Mai 2000 19:36
Kontaktdaten:

#6 Beitrag von killerhippy » 27. Jan 2011 3:18

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: Alles auswählen

  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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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

Benutzeravatar
Janka
Beiträge: 3585
Registriert: 11. Feb 2006 19:10

#7 Beitrag von Janka » 27. Jan 2011 12:58

killerhippy hat geschrieben: 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.

Benutzeravatar
killerhippy
Beiträge: 529
Registriert: 19. Mai 2000 19:36
Kontaktdaten:

#8 Beitrag von killerhippy » 27. Jan 2011 23:15

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: Alles auswählen

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

Benutzeravatar
killerhippy
Beiträge: 529
Registriert: 19. Mai 2000 19:36
Kontaktdaten:

#9 Beitrag von killerhippy » 02. Feb 2011 13:58

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

Benutzeravatar
killerhippy
Beiträge: 529
Registriert: 19. Mai 2000 19:36
Kontaktdaten:

Update auf v0.0.2

#10 Beitrag von killerhippy » 27. Feb 2011 15:16

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

Antworten