2008-08-13 13 views
8

Ich habe dieses Programm, wir nennen es Host. Der Host macht alle möglichen guten Dinge, aber er muss in der Lage sein, Eingaben über die Befehlszeile zu akzeptieren, während er ausführt. Das bedeutet, dass es seine anderen Prozessdaten irgendwie senden und dann beenden muss. Zum Beispiel muß ich in der Lage sein, dies zu tun:Senden Sie Nachrichten an das Programm über die Befehlszeile

./Host --blahblah 3 6 3 5 

Dies sollte irgendwie irgendeine Funktion in Host Aufruf am Ende genannt

handleBlahBlah(int x1, int y1, int x2, int y2){ 
    //do some more sweet stuff 
} 

-Host ein C-Programm ist, und muß nicht mehrfach unterstützen Instanzen.

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

Ich muss dies in Linux oder Windows tun können. Vorzugsweise Linux.

Was ist der sauberste Weg, dies zu implementieren?

+0

Möchten Sie Argumente übergeben, wenn das Programm bereits ausgeführt wird? Für welches Betriebssystem ist dies programmiert? –

Antwort

-2

So kann ich hier den Punkt vermissen, aber durch taubult nimmt eine Hauptfunktion des C-Programms zwei Argumente; 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:

int main(int argc, *argv[]) 
{ 
    /*loop through each argument and take action*/ 
     while (--argc > 0) 
     { 
      printf(%s%s, *++argv, (argc > 1) ? " " : ""); 
     } 
} 

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

EDIT: Ok, er war nach etwas anderem, aber es war nicht wirklich klar, bevor die Frage bearbeitet wurde. Müssen Sie nicht auf meine Repe ...

8

Wenn Sie unter Windows waren, würde ich Ihnen sagen, ein verstecktes Fenster zu verwenden, um die Nachrichten zu empfangen, aber da Sie ./ verwendet, nehme ich an, Sie wollen etwas Unix- basierend. In diesem Fall würde ich mit named pipe gehen. Sun hat eine 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önnte ändern Sie Ihr Programm zur Unterstützung der Befehlszeile senden statt 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.

+1

+1 Ich habe diese Named Pipe-Methode mehrmals verwendet und es funktioniert ganz gut. Ich habe auch UNIX-Sockets für Fälle verwendet, in denen das Hauptprogramm Daten an das Befehlszeilenskript/-programm zurückgeben musste. – jschmier

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.

4

Ich empfehle entweder Unix socket oder D-Bus. Die Verwendung eines Sockets könnte schneller sein, wenn Sie mit der Programmierung von Unix-Sockets vertraut sind und nur ein paar Operationen wünschen, während D-Bus es einfacher macht, sich auf die Funktionalität in einer vertrauten objektorientierten Weise zu konzentrieren.

Werfen Sie einen Blick auf Beej's Guide to Unix IPC, insbesondere das Kapitel Unix sockets.

1

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

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

Das Beispiel des Aufrufens „fillinthename Argumente ...“ mit fillinthename kommunizieren einmal fillinthename nur durch Verwendung von zwei Instanzen des Programms erreicht werden kann, ausgeführt wird, die miteinander kommunizieren.

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

Ein amarok wie Programm benötigt die Existenz einer anderen Instanz von selbst, um die Rolle zu wissen, zu erkennen, sie spielen müssen, die wichtige Rolle der persistent Nachrichtenempfänger/Server, oder die untergeordnete Rolle eines Schusses Absender der Nachricht

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

0

Eine Technik, die ich gesehen habe, ist Ihre Host Programm nur eine "Shell" für Ihr echtes Programm zu haben. 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 andere Option, die fork nicht verwendet, ist Host eine reine "Nachrichtenabsender" -App und Ihre "Hauptanwendung" als separate ausführbare Datei (z. B. Host_core), die Host kann separat gestartet werden.

Der "Haupt-App" -Teil Ihres Programms muss eine Art von Kommunikationskanal zum Empfangen von Nachrichten öffnen, und der "Nachrichtenabsender" -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 channels und BeOS/Haiku haben BMessages. Möglicherweise finden Sie auch eine Bibliothek, die diese Funktionalität sauber umschließt, z. B. lcm.

Verwandte Themen