Senden Sie Nachrichten über die Befehlszeile an das Programm

8

Ich habe dieses Programm, wir nennen es Host. Der Host macht alle möglichen guten Dinge, aber er muss Eingaben über die Befehlszeile akzeptieren können, während er ausgeführt wird . Das bedeutet, dass es seine anderen Prozessdaten irgendwie senden und dann beenden muss. Zum Beispiel muss ich das können:

%Vor%

Dies sollte irgendwie dazu führen, dass eine Funktion im Host namens

aufgerufen wird %Vor%

Host ist ein C-Programm und muss nicht mehrere Instanzen unterstützen.

Ein Beispiel dafür ist Amarok Music Player. Wenn Amarok läuft und spielt, kannst du "amarok --pause" eingeben und es wird die Musik anhalten.

Ich muss das unter Linux oder Windows machen können. Vorzugsweise Linux.

Was ist der sauberste Weg, dies zu implementieren?

    
andrewrk 13.08.2008, 22:40
quelle

6 Antworten

8

Wenn du unter Windows wärst, würde ich dir sagen, dass du ein verstecktes Fenster benutzen sollst, um die Nachrichten zu erhalten, aber da du ./ benutzt hast, nehme ich an, du willst etwas Unix-basiertes.

In diesem Fall würde ich mit einer Named Pipe gehen. Sun hat ein Tutorial über Named Pipes, die nützlich sein könnten.

Das Programm würde wahrscheinlich die Pipe erstellen und zuhören. Sie könnten ein separates Befehlszeilenskript haben, mit dem die Pipe geöffnet wird und nur ihre Befehlszeilenargumente zurückgegeben werden.

Sie könnten Ihr Programm so modifizieren, dass es das Senden über die Befehlszeile unterstützt, anstatt ein separates Skript zu verwenden. Sie würden das gleiche grundlegende Ding in diesem Fall tun. Ihr Programm würde sich die Befehlszeilenargumente ansehen und gegebenenfalls die Pipe zur "Main" -Instanz des Programms öffnen und die Argumente durchreichen.

    
Derek Park 13.08.2008 22:49
quelle
5

Wenn es plattformübergreifend sein muss, sollten Sie erwägen, die laufende Instanz auf einen TCP-Port aufmerksam zu machen und die von der Befehlszeile aus startende Instanz eine Nachricht an diesen Port senden zu lassen.

    
Stu 13.08.2008 22:51
quelle
4

Ich schlage vor, entweder einen Unix-Socket oder D-Bus . Die Verwendung eines Sockets könnte schneller sein, wenn Sie mit der Unix-Socket-Programmierung vertraut sind und nur ein paar Operationen wünschen, während D-Bus es einfacher machen könnte, die Funktionalität auf bekannte objektorientierte Weise zu implementieren.

Sehen Sie sich Beejs Guide to Unix IPC an, insbesondere das Kapitel über < a href="http://beej.us/guide/bgipc/output/html/multipage/unixsock.html"> Unix-Sockets .

    
Ted Percival 18.08.2008 08:55
quelle
1

Was niemand hier gesagt hat, ist dies: "Sie können nicht von hier kommen".

Die Befehlszeile ist nur so verfügbar, wie sie war, als Ihr Programm aufgerufen wurde.

Das Beispiel des Aufrufs von " fillinthename Argumenten ..." zur Kommunikation mit fillinthename , sobald fillintname ausgeführt wird, kann nur mit zwei Methoden erreicht werden Instanzen des Programms, die miteinander kommunizieren.

Die anderen Antworten schlagen Wege vor, um die Kommunikation zu erreichen.

Ein ähnliches Programm muss die Existenz einer anderen Instanz erkennen von sich selbst, um zu wissen, welche Rolle es spielen muss, die große Rolle von persistenter Nachrichtenempfänger / Server oder die untergeordnete Rolle von one shot Absender der Nachricht.

bearbeitet, damit das Wort fillinthename tatsächlich angezeigt wird.

    
pbernatchez 07.06.2010 14:47
quelle
0

Eine Technik, die ich gesehen habe, ist, dass Ihr Programm Host nur eine "Shell" für Ihr echtes Programm ist. Wenn Sie Ihre Anwendung beispielsweise normal starten (z. B. ./Host ), verzweigt das Programm in den "Haupt-App" -Teil Ihres Codes. Wenn Sie Ihr Programm so starten, dass Sie der laufenden Instanz signalisieren möchten (z. B. ./Host --send-message restart ), verzweigt das Programm in den Teil "Nachrichtensender" Ihres Codes. Es ist wie zwei Apps in einem zu haben. Eine weitere Option, die fork nicht verwendet, besteht darin, Host zu einer reinen "Nachrichtenabsender" -App zu machen und Ihre "Hauptanwendung" als separate ausführbare Datei zu verwenden (zB Host_core ), die Host separat starten kann / p>

Der "Hauptanwendungs" -Teil Ihres Programms muss eine Art Kommunikationskanal zum Empfangen von Nachrichten öffnen, und der "Nachrichtensender" -Teil muss sich mit diesem Kanal verbinden und ihn zum Senden von Nachrichten verwenden. Zum Senden von Nachrichten zwischen Prozessen stehen verschiedene Optionen zur Verfügung. Einige der üblicheren Methoden sind Pipes und Sockets . Abhängig von Ihrem Betriebssystem verfügen Sie möglicherweise über zusätzliche Optionen. Zum Beispiel hat QNX Kanäle und BeOS / Haiku haben < a href="http://api.haiku-os.org/classBMessage.html"> BMessages . Möglicherweise finden Sie auch eine Bibliothek, die diese Funktionalität auf einfache Weise bereitstellt, z. B. lcm .

    
bta 11.08.2010 17:32
quelle
-2

Also, ich vermisse vielleicht den Punkt hier, aber durch taubult nimmt die Hauptfunktion eines C-Programms zwei Argumente an; argc, eine Anzahl der Argumente (mindestens eine) und argv (oder arg vector), die Argumentliste. Sie könnten einfach die Argumente analysieren und die richtige Methode aufrufen. Zum Beispiel:

%Vor%

würde alle Argumente auf dem Bildschirm ausgeben. Ich bin kein C-Guru, also hoffe ich, dass ich keine Fehler gemacht habe.

EDIT: Ok, er wollte etwas anderes, aber es war nicht wirklich klar, bevor die Frage bearbeitet wurde. Ich muss nicht auf meinen Repräsentanten springen ...

    
Ed S. 13.08.2008 22:43
quelle

Tags und Links