Hallo Leute,
mein neuestes Spielzeug ist ein LCD mit einer Auflösung von 20x4 Zeichen. An den Parallelport angeschlossen ergibt das eine tolle Statusanzeige für z.B. einen Server. Auf dem Server laufen für gewöhnlich viele verschiedene Prozesse bzw. Scripte, die evtl. alle mal was auf das Display schreiben wollen. Da sich das Display nur "in einem Rutsch" beschreiben lässt, muss sich irgendein zentrales Programm darum kümmern, das die "Schreib-Forderungen" von anderen Prozessen an sinnvoller Stelle durchführt. Dafür habe ich folgende Programme geschrieben: Serverprogramm (lcdserv) liest jede Sekunde die Datei /tmp/lcd.stat und stellt den Inhalt (genau 80 Zeichen) auf dem LCD dar. Beschreiben des LCD ist mit dem Client (lcdclient) durch Angabe der Startposition (0-79) und eines Ascii-Strings möglich. lcdclient ist suid und darf als einziger auf /tmp/lcd.stat schreiben. Verschiedene Scripte auf dem Server rufen nun mehr oder weniger häufig den lcdclient auf, weil sie ihren aktuellen Status auf dem Display zeigen wollen. Beispiel: jede Sekunde wird die Anzeige des freien Speichers auf den zwei /home-Partitions an- gezeigt. Diese Scripts verschlingen im Vergleich zum lcdserver (der ja auch jede Sekunde etwas tut) riesig viel Rechenzeit. Deshalb will ich über mehrere kleine C-Programme /proc oder den Status der Modemleitung abfragen. Diese Programme müssten dann aber irgendwie Kontakt zum lcdserver aufnehmen können, der ideal- erweise seine Image-Datei /tmp/lcd.stat nicht mehr benötigt.
Deshalb: Wie kann ich Prozesse unter Linux am einfachsten mit- einander kommunizieren lassen, wenn es einen Server-Prozess und eine beliebig wechselnde Menge an Client-Prozessen geben soll? Für ein hilfreiches Stichwort wäre ich sehr dankbar, gehört habe ich schon einmal Begriffe wie IPC, Sockets etc..., weiß aber nicht, was jetzt wo einzuordnen ist.
Viele Grüße,
Matthias
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Sunday 16 December 2001 17:21, Matthias Petermann wrote: [cut]
Deshalb: Wie kann ich Prozesse unter Linux am einfachsten mit- einander kommunizieren lassen, wenn es einen Server-Prozess und eine beliebig wechselnde Menge an Client-Prozessen geben soll? Für ein hilfreiches Stichwort wäre ich sehr dankbar, gehört habe ich schon einmal Begriffe wie IPC, Sockets etc..., weiß aber nicht, was jetzt wo einzuordnen ist.
Server: Bau eine AF_LOCAL Socket in /tmp oder /var auf. (man: socket(2), bind(2), listen(2), unix(7)) Dann hast Du erstmal eine Serversocke, die Du zum Aufbauen echter Verbindungen nehmen kannst.
Dann lausche mit select(2) an dem Teil und warte auf ein Read-Ereignis (read in Ermangelung einer "IWANTCONNECT"-Queue). Wenn es kommt will jemand eine Verbindung aufbauen: mit accept(2) annehmen und danach fleissig auf der Serversocke nach weiteren Verbindungen lauschen.
accept gibt Dir einen neuen Deskriptor, auf dem Du ueber das selbe select auf echte Read-Ereignisse warten kannst (read(2) genau lesen, um rauszubekommen, wann die Gegenseite die Verbindung geschlossen hat; errno(3)).
Wenn was ankommt einfach Display updaten....
Client: Socket erzeugen und mit dem Server verbinden (man: socket(2), connect(2), unix(7)). Dann einfach reinschreiben und Socket wieder zumachen (shutdown(2), close(2)).
Konrad
- -- BOFH excuse #79:
Look, buddy: Windows 3.1 IS A General Protection Fault.
Hallo Konrad(1), Konrad(2) und Stephan,
vielen Dank für Eure Tipps und Hinweise. Die Verweise auf die Manpages haben mir wirklich geholfen, jetzt weiß ich wenigstens eine grobe Richtung, in die ich mich durchlesen sollte :-) Bei LCDproc werd ich dann mal vorbei schauen, wenn die das auch mit Client+Server machen wäre das sicher interessant.
Viele Grüße und nochmals Danke,
Matthias
Am Sonntag 16 Dezember 2001 17:21 schrieben Sie:
Hallo Leute,
mein neuestes Spielzeug ist ein LCD mit einer Auflösung von 20x4 Zeichen. An den Parallelport angeschlossen ergibt das eine tolle Statusanzeige für z.B. einen Server. Auf dem Server laufen für gewöhnlich viele verschiedene Prozesse bzw. Scripte, die evtl. alle mal was auf das Display schreiben wollen. Da sich das Display nur "in einem Rutsch" beschreiben lässt, muss sich irgendein zentrales Programm darum kümmern, das die "Schreib-Forderungen" von anderen Prozessen an sinnvoller Stelle durchführt. Dafür habe ich folgende Programme geschrieben: Serverprogramm (lcdserv) liest jede Sekunde die Datei /tmp/lcd.stat und stellt den Inhalt (genau 80 Zeichen) auf dem LCD dar.
Cool wäre wenn man die Aktualisierungszeit einstellen könnte. Nicht jeder brauch die Info's auf die Sekunde genau.
Stephan
Am Sun, 16.Dec 2001 um 05:21 schrieb Matthias Petermann:
Hallo Leute,
mein neuestes Spielzeug ist ein LCD mit einer Auflösung von 20x4 Zeichen. An den Parallelport angeschlossen ergibt das eine tolle Statusanzeige für z.B. einen Server. Auf dem Server laufen für gewöhnlich viele verschiedene Prozesse bzw. Scripte, die evtl. alle mal was auf das Display schreiben wollen. Da sich das Display nur "in einem Rutsch" beschreiben lässt, muss sich irgendein zentrales Programm darum kümmern, das die "Schreib-Forderungen" von anderen Prozessen an sinnvoller Stelle durchführt.
Schau doch mal bei LcdProc vorbei:
http://lcdproc.omnipotent.net/ Die machen genau das... und freuen sich bestimmt über Hilfe!
Mit freundlichen Grüßen Konrad Riedel
lug-dd@mailman.schlittermann.de