Interaktion / Kommunikation von zwei Programmen



  • Hallo alle zusammen,
    Ich weiß jetzt nicht ob ich im richtigen Unterforum bin, wenn nicht, bitte verschieben.
    Es geht um folgendes:
    Ich habe ein Programm (Konsolenprogramm) in C geschrieben, dass läuft wunderbar.
    Jetzt habe ich aber zwei fragen:
    die erste würde eher ins GUI Forum passen...:
    Ich möchte für das Programm eine GUI machen / programmieren, am liebsten mit QT (was nicht das Problem ist, mit QT und C++ Fenster zu erstellen und dort bestimmte Aktionen bei bestimmten eingaben auszuführen kann ich).
    Hier ist eher das Problem:
    z.b. das C Programm soll den Code ausgeben, dazu startet man es normaler Weise in der Konsole:
    programm -c
    Doch wie bekomme ich es jetzt hin, dass das was normaler Weise in der Konsole ausgeben wird, an mein QT Programm geschickt wird?

    Die zweite Frage ist so ähnlich:
    Wie funktioniert eine generelle Kommunikation zweier Programme?
    Sprache ist hier am besten C, C++ geht aber auch.

    Ich konnte zu beidem nichts in der Forensuche oder bei Google finden, außer zu Windows spezifischen.

    Noch was: Mein System ist openSUSE, also das sollte später unter Linux funktionieren, aber falls es möglich wäre, dass man es auf alle System Portionieren kann, wäre es natürlich noch schöner.

    Danke und einen schönen Rest 4. Advent,
    Ferdinand



  • C: Pipes
    C++: Boost.Interprocess
    Qt (ein Java-like-Toolkit): IPC (Examples)

    Du musst deine Frage präzisieren: Was willst du genau? Willst du den stdout des anderen Programms lesen? Willst du Datenstrukturen hin und her schicken? Willst du Funktionen des anderen Prozesses aufrufen? Willst du einen gemeinsamen Speicher nutzen?
    Das Problem tritt häufig auf, darum gibt es zahlreiche spezialisierte Lösungen.

    Manchmal braucht man auch gar keine verschiedenen Prozesse, verschiedene Threads reichen.

    Für dein Problem zum Beispiel, benötigst du eine einseitige Kommunikation, ein Prozess schreibt und liest, wann er will. Da reichen Pipes locker aus, oder, wenn du schon das komische Qt verwendest, ein QProcess. Und das alles nur im GUI-Projekt einbauen, das Konsolenprogramm bleibt, wie es ist. Notfalls kannst du ihm noch einen --batch-mode verpassen.

    :xmas1:



  • Danke!!
    Pipes ist schon mal sehr interessant.

    Bei dem Beispiel, wäre es eher so, dass ich gerne ein Programm (GUI) schreiben würde, was den output von meinem Konsolen Programm liest, am liebsten wäre es mir da wenn es den wirklichen output lesen könnte als das was mit print oder puts geschrieben wird, aber ich könnte das Konsolen Programm auch so anpassen, dass man die return werte lesen könnte.
    Also das soll dann so sein, wie bei schon vielen anderen Programmen, z.B. gibt es ja auch GUIs von Recordmydesktop, ffmpeg oder andere.
    und die greifen ja auch irgendwie auf die Ausgabe des Hauptprogramme (Konsole) zu.
    Ich hoffe ihr versteht was ich meine.
    MfG,

    Edit:
    Vielleicht hilft es weiter, wenn ich noch folgendes hinzufüge:
    Ich habe mir das so vorgestellt, in dem Grafischen Programm, wähle ich z.B. einige Parameter aus, dieses Programm startet dann das Konsolen Programm, Bsp.:
    programm -Parameter

    Jetzt gibt dieses Programm einen Wert zurück (naja im Moment nur Text in der Konsole), und dies soll jetzt mit dem Grafischen Programm dargestellt werden, also eine einfach GUI.



  • Was du meinst ist ein grafisches Frontend für ein Konsolenprogramm.

    Was meinst du mit

    derFer schrieb:

    am liebsten wäre es mir da wenn es den wirklichen output lesen könnte als das was mit print oder puts geschrieben wird

    ? Printf() ist doch der wirkliche Output 😕

    Sowas kann man in begrenzter Form mit der ANSI-C-Standardbibliothek machen. Mit dem Befehl system() und Ausgabeumlenkung:

    char  stdout_log_name[256]="stdout.log",
          cmd_line[512];
    int   exit_code;
    FILE *logfp;
    
    sprintf(cmd_line,"program >%s -c",stdout_log_name);
    exit_code=system(cmd_line);
    
    logfp=fopen(stdout_log_name,"r");
    /* hier stdout ausgabe von "program -c" einlesen */
    fclose(fp);
    

    Der Nachteil bei dieser Methode ist, daß du warten mußt bis die Ausführung von program.exe beendet ist. Mit Betriebssystemspezifischen Funktionen kannst du die Ausgabe einlesen während programm.exe läuft.



  • Wenn du schon von beiden Programmen den Quellcode vorliegen hast, würde ich die saubere Variante nutzen und die Funktionen in eine Bibliothek auslagern. Diese kannst du dann mit jedem beliebigen Interface ansprechen.
    Was ich auch noch nicht hier gelesen habe, ist eine IPC (Inter Process Commmunication) über Sockets. Dabei würde ich einfach meine Ausgabe/Eingabe über den Socket erledigen. Dabei musst du an deinem Programm nicht viel ändern, außer dass du zusätzlich für die Konsole einen Proxy benötigst. An der Stelle würde es sich auch anbieten generische Kommandos zu nutzen, die du erst im Proxy formatierst. Das erleichtert dir dann auch die Arbeit in deiner GUI.
    Wenn es aber keinen sinnvollen Grund gegen die erste Variante gibt, würde ich diese klar bevorzugen.


Anmelden zum Antworten