phost
Anmeldungsdatum: 12. August 2014
Beiträge: 35
|
Zu allererst: falls dies das falsche Forum ist und ich dafür lieber in einem C++ Forum fragen sollte bitte nur Bescheid geben^^ Ich würde gerne zu Selbst-Lern-Zwecken ein C++ Programm schreiben was ich über die Kommandozeile steuern kann.
Im Prinzip also so wie ein GUI-Programm, nur das die GUI halt durch entsprechende Shell-Eingaben ersetzt werden. Meine Google-Suche hat immer nur den umgekehrten Fall geliefert, nämlich das man mit C++ Shell-Eingaben tätigt. Hintergrund:
Das Programm soll über eine php-Weboberfläche gesteuert werden können. Sprich die Shell-Eingaben kommen dann über das php-Script, aber das Programm selbst soll in C++ laufen. Ich möchte damit bewerkstelligen, dass ich eine Art Musikplayer habe (an dem Server hängen Boxen), den ich über die Weboberfläche steuern kann. Soll heißen: ich bin auf der Weboberfläche, dort kann ich dann Titel etc. auswählen, die gewählten Titel sollen dann an das C++ Programm übergeben werden, welches diese dann abspielt. Da ich aber gerne den Musikplayer direkt bei Serverstart auch starten möchte brauche ich entsprechend die Möglichkeit das Teil über Kommandos zu steuern. Was ich jetzt also konkret bräuchte:
Weiterführende Links (die ich bisher scheinbar nicht gefunden habe oder zu flüchtig nur gelesen habe) oder Ansätze damit ich weiß wie das vom Prinzip her funktioniert 'n Gruß /edit: ups ich seh grad ich bin aus Versehen im falschen Forum gelandet, bitte in "Shell und Programmierung" verschieben /edit2: ich habe es jetzt auf eigene Faust bereits hinbekommen ein simples C++ Programm auf dem Server zu starten. Allerdings fehlt mir jetzt noch der Ansatz dazu wie ich das Programm so schreibe das es durch den Server steuerbar ist. Moderiert von jug: Verschoben
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12848
|
Du könntest auf einer Named-Pipe lauschen, über die dann andere Prozesse (z.B. Dein PHP) Kommandos schicken. Das ist möglicherweise das einfachste. Etwas typischer für Server wäre, einen Socket aufzumachen (kann auch Unix-Domain sein, damit er nicht vom Netz her aus erreichbar ist), darauf zu lauschen und über Verbindungen, die geöffnet werden, dann die Kommandos zu lesen. Dann müsstest Du aber auch den Fall behandeln, dass es mehrere parallele Verbindungen geben könnte.
|
Dee
Anmeldungsdatum: 9. Februar 2006
Beiträge: 20087
Wohnort: Schwabenländle
|
Du kannst Dir auf http://www.freiesmagazin.de/sechster_programmierwettbewerb anschauen, wie ich die Kommunikation mittels Named Pipes umgesetzt habe. Dafür ist das Skript start.sh und natürlich die main.cc wichtig. Gruß Dee
|
phost
(Themenstarter)
Anmeldungsdatum: 12. August 2014
Beiträge: 35
|
Zunächst einmal Danke für die Idee mit der Named-Pipe und auch das entsprechende Beispiel
Werde mich damit jetzt mal befassen und dann ggf nochmal Rückmeldung geben^^ /edit: habe mir jetzt auf Galileo Computing das mal durchgelesen und würde nun gern sicherstellen das ich es richtig verstanden habe..
In meinem Beispiel sähe es dann also so aus, dass meine PHP-Weboberfläche über shell_exec etwas in die Pipe reinschreibt und mein C++ Programm dauerhaft in einer Art Schleife schaut ob etwas in der Pipe steht und falls dies der Fall ist das ausliest und entsprechend verarbeitet??
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6351
Wohnort: Hamburg
|
Meine Google-Suche hat immer nur den umgekehrten Fall geliefert,...
Möglicherweise würde Command Line Interface (CLI) bessere Ergebnisse liefern. Die Hinweise auf Named-Pipes oder Sockets zeigen zwar in die richtige Richtung, sind für einen Einsteiger aber möglicherweise eine zu hohe Hürde oder zu viel Aufwand für das was du vermutlich vor hast. Daher wage ich mal einen Alternativ Vorschlag: Schreibe dein Programm so, dass alle Ein/Ausgaben explizit über stdin/stdout laufen. Evtl. könnte es auch hilfreich sein, sich die Funktion getenv() anzusehen. Damit hättest du dann auch Zugriff auf die Umgebungsvariablen des Servers (falls nötig). Das Programm könntest du dann direkt als CGI (nicht FastCGI !) Programm starten, wenn der Server dafür konfiguriert wurde. Du kannst aber auch die PHP Funktion system() benutzen. Du solltest dann aber darauf achten, das der Benutzer dort keine unerlaubten zusätzlichen Daten eingeben kann.
|
phost
(Themenstarter)
Anmeldungsdatum: 12. August 2014
Beiträge: 35
|
Dakuan schrieb: Möglicherweise würde Command Line Interface (CLI) bessere Ergebnisse liefern.
Ich glaube CLI wäre sogar genau das was ich mir vorgestellt habe.. Zumindest wenn das hieße das ich den Musikplayer dann in etwa so ansprechen könnte
| musicplayer -play /link/zu/einer/playlist
|
wobei ich die playlist dann vermutlich mittels php als datei erstelle (wo dann halt die Pfade zu den jeweiligen Dateien drin stehen)
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6351
Wohnort: Hamburg
|
Ich kenne musicplayer nicht, da ich Squeezebox verwende. Aber wenn der so funktioniert, wie ich vermute, könntest du den musicplayer mit dem Pfad zur Playlist auch direkt von PHP mit der Funktion system() aufrufen. Dabei würde dann allerdings der Lerneffekt zur C++ Programmierung verloren gehen. Aber da könnte es sich anbieten, die Playlisten mittels C++ Programm zu erstellen. Ich denke das könnte schneller sein als PHP. An der Schnittstelle würde sich da nichts ändern.
|
phost
(Themenstarter)
Anmeldungsdatum: 12. August 2014
Beiträge: 35
|
"musicplayer" wäre dann ja das C++ programm was ich gedenke zu schreiben. Und da das ganze ja über die Weboberfläche gesteuert wird dachte ich daran das ich PHP die Playlisten zusammenstelle lasse, so dass der eigentliche Player dann nur noch abspielen muss. Zumal ich gedenke meine ganzen Musikdateien in einer MySQL-Datenbank zu hinterlegen mit den mp3-Tags etc. Mir geht es jetzt also primär darum herauszufinden wie ich mein C++ Programm (also den Player) so schreibe, dass er bei Serverstart direkt mitstartet und dann darauf wartet das er durch PHP (wohl am besten dann mittels CLI?) seine Befehle mit Parametern bekommt und diese dann entsprechend verarbeitet. Ich könnte natürlich den Player bei jedem neuen Befehl einfach neustarten mit dann neuen Parametern, allerdings erscheint mir das etwas uneffizient.. Also den für jeden neuen Befehl neustarten zu müssen. Zumal man ja evtl auch nur einfach ein paar Lieder der Playlist hinzufügen möchte aber die Wiedergabe nicht unterbrochen werden soll.
|
Dakuan
Anmeldungsdatum: 2. November 2004
Beiträge: 6351
Wohnort: Hamburg
|
Mir geht es jetzt also primär darum herauszufinden wie ich mein C++ Programm (also den Player) so schreibe, dass er bei Serverstart direkt mitstartet und dann darauf wartet das er durch PHP (wohl am besten dann mittels CLI?) seine Befehle mit Parametern bekommt und diese dann entsprechend verarbeitet.
Das erscheint mir jetzt aber doch eine Nummer komplizierter. Du müsstest dann den Player als Daemon schreiben (was ich noch nicht gemacht habe) und da kämen als Kommunikationswege wieder die bereits vorgeschlagenen Named Pipes oder Sockets ins Gespräch (Thema: Inter Process Communication). Auf dem Gebiet bin ich aber auch noch Anfänger.
|
phost
(Themenstarter)
Anmeldungsdatum: 12. August 2014
Beiträge: 35
|
Wie kann ich denn verhindern das sich mein Programm direkt beendet??
Also Konsolenprogramme laufen ja eigentlich nur ihre main durch und dann ist schluss. Muss ich dann einfach eine Endlosschleife darin generieren die dauerhaft zB die named pipe ausliest? Und erst wenn zB in der Pipe sowas wie "end" oder so steht wird die Schleife verlassen?
|
Dee
Anmeldungsdatum: 9. Februar 2006
Beiträge: 20087
Wohnort: Schwabenländle
|
@phost: Hast Du denn mein Beispiel angeschaut? Da wird genau das beantwortet. Und ja, es handelt sich um eine Endlosschleife, wo Du solange auf Befehle des Servers wartest, bis der sagt, dass Du Dich beenden darfst. Gruß Dee
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
Wobei der OP trotzdem nicht um Threading herum kommen wird, es sei denn, er spricht auch über sein C++-Programm einen Daemon-Prozess an...
|
phost
(Themenstarter)
Anmeldungsdatum: 12. August 2014
Beiträge: 35
|
Dee schrieb: @phost: Hast Du denn mein Beispiel angeschaut? Da wird genau das beantwortet. Und ja, es handelt sich um eine Endlosschleife, wo Du solange auf Befehle des Servers wartest, bis der sagt, dass Du Dich beenden darfst. Gruß Dee
Auf der Seite die du verlinkt hast konnte ich nur Beispielcode finden, vermutlich vom Veranstalter des Wettbewerbs? Lysander schrieb: Wobei der OP trotzdem nicht um Threading herum kommen wird, es sei denn, er spricht auch über sein C++-Programm einen Daemon-Prozess an...
Was genau meinst du mit OP?^^
Und ja ich würde es vermutlich auch über Threads machen wollen.
Da ich aber noch nicht genau weiß was so ein "Daemon-Prozess" ist muss ich mich da noch etwas einlesen schätze ich^^ /edit: Daemon-Prozesse scheinen ja einfach Prozesse zu sein die schlicht im Hintergrund laufen, richtig? Das heißt die Kommunikation zwischen dem C++-Programm und der Weboberfläche müsste ich nach wie vor über Named-Pipes realisieren? Was mich an der Idee ein wenig "stört" das ich dann immer noch den Zwischenschritt über die Shell habe. Gibt es denn wirklich nichts womit ich das C++ Programm "direkt" ansteuern kann? Von der Idee halt sowas wie Buttons auf einer GUI.. Sprich das ich dem C++ Programm sagen kann, "ich habe hier den Knopf gedrückt, mach mal".
|
Dee
Anmeldungsdatum: 9. Februar 2006
Beiträge: 20087
Wohnort: Schwabenländle
|
Auf der Seite die du verlinkt hast konnte ich nur Beispielcode finden, vermutlich vom Veranstalter des Wettbewerbs?
Kein Beispielcode, sondern ausführbarer Code, der ein komplettes Client-Server-Konzept darstellt. Der Veranstalter und Entwickler des Codes bin ich.
Gibt es denn wirklich nichts womit ich das C++ Programm "direkt" ansteuern kann?
Doch, die oben erwähnten Sockets. Auch hier findest Du auf der freiesMagazin-Seite ein Beispiel, wie das geht: http://www.freiesmagazin.de/dritter_programmierwettbewerb Verbindung lief dann über Port 15000 auf localhost. Gruß Dee
|
Lysander
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
phost schrieb: Was genau meinst du mit OP?^^
Dich - den Original Poster 😉
Da ich aber noch nicht genau weiß was so ein "Daemon-Prozess" ist muss ich mich da noch etwas einlesen schätze ich^^
Naja, ein Prozess eben, der permanent läuft und der mit seiner Umwelt kommunizieren kann; einfach durch irgend einen IPC-Mechanismus (Sei es nun DBus, TCP/IP, Http, Named Pipes, usw.). Wenn Du einen Musikplayer selber bauen willst, dann musst Du genau so etwas implementieren. Dabei hast Du zwangsläufig Nebenläufigkeiten. D.h., dass Du Dich mit Event-Driven-Programming auseinandersetzen musst. Ein "Thread" (oder Prozess) spielt Musik ab, und einer kann mit der Außenwelt kommunizieren, d.h. Befehle entgegen nehmen oder Informationen zurück liefern. Letzterer kann dann den ersten steuern, je nach Anweisung von außen. Das ist alles andere als trivial - insbesondere in C++ natürlich 😈
|