makefile in Programm (C/C++) ausführen und auf Ein- und Ausgaben zugreifen



  • Hallo,

    ich habe ein Programm, dass über ein Makefile gestartet wird. Dieses Programm dient zum Testen und läuft unter FreeBSD. Muss manuell etwas getan werden, so unterbricht das Programm, sagt was zu tun ist und wird nach dem Drücken der Enter-Taste fortgesetzt.

    Was wann zu tun ist weiß ich, daher möchte ich das ganze automatisieren. Mein Plan ist es, die Ausgaben des Programms abzufangen und auf die Zeile "Bitte Enter zum Fortfahren drücken" mit dem Versenden eines Ethernet-Pakets zu reagieren und dem Programm dann als Eingabe die "Enter-Taste" zu geben.

    Jetzt weiß ich zum einen nicht, in welcher Sprache sich das besser programmieren lässt (C oder C++ unter FreeBSD) und wie ich ein Makefile in einem C/C++ Programm starte bzw. wie ich auf die Ein- und Ausgaben zugreifen kann.

    €: Habe mal ein Beispielprogramm gefunden, das mein Problem wohl umsetzen soll, völlig verstanden habe ich das aber noch nicht:

    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    
    pid_t pid;
    int p2c[2], c2p[2];
    
    pipe(p2c);
    pipe(c2p);
    
    pid = fork();
    
    if (pid == 0) { /* child */
      dup2(p2c[0], stdin);
      dup2(p2c[1], stdout);
    
      execvp(...); /* anderes Programm starten */
    } else {
      FILE *tochild, *fromchild;
    
      close(p2c[0]);
      tochild = fdopen(p2c[1], "w");
    
      close(c2p[1]);
      fromchild = fdopen(c2p[0], "r");  
    
      /* tochild / fromchild benutzen */  
    }
    

    Gruß

    Ryo



  • #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    
    pid_t pid;
    int p2c[2], c2p[2];
    /* Erstelle eine pipe. p2c[0] ist das lesbare Ende der pipe, p2c[1] das
     * schreibbare. */ 
    pipe(p2c);
    /* analog zu p2c */
    pipe(c2p);
    
    /* Erstelle einen neuen Prozess. Dieser führt eine Kopie des aktuellen Prozesses
     * aus */
    pid = fork();
    /* ab hier sind es 2 Prozesse. Der Vater hat pid== PID des Kindes, der
     * Kindprozess hat pid==0 */
    if (pid == 0) { /* child */
      /* setze stdin auf p2c[0] und stdout auf p2c[1]. */
      dup2(p2c[0], stdin);
      /* Ich behaupte das muss c2p[1] heissen */
      dup2(p2c[1], stdout);
    
      /* ersetze diesen Prozess durch ein anderes programm */
      execvp(...); /* anderes Programm starten */
    } else {
      FILE *tochild, *fromchild;
    
      close(p2c[0]);
      tochild = fdopen(p2c[1], "w"); 
    
      close(c2p[1]);
      fromchild = fdopen(c2p[0], "r");  
    
      /* tochild / fromchild benutzen */ 
      /* Alles was ab hier in tochild geschrieben wird kommt im Kindprozess in stdin
     * an, alles was der Kindprozess in stdout schreibt kommt in fromchild an */ 
    }
    

    Hoffe es ist jetzt klarer



  • Danke für die Antwort.

    Nach etwas googeln und deinen Kommentaren verstehe ich das ganze nun so langsam.

    Ich habe das Programm nun schon etwas erweitert und möchte aus dem Parent-Prozess so lange die Ausgaben vom Child-Prozess lesen, wie dieser lebt.

    Dazu hätte ich zunächst eine do-while-Schleife mit folgender Bedingung:

    while (kill(pidChild, 0) == 0);
    

    Jedoch wird der Child-Prozess wohl nicht ganz beendet, da er ewig in dieser Schleife hängen bleibt. Kann ich im Child-Prozess am Ende irgendwie ein Kommando absetzen, dass diesen dann wirklich killt?

    Denn ein wait() im Parent-Prozess geht ja nicht, ich will ja nicht auf das Beenden warten, sondern während der Child-Prozess läuft selber aktiv sein.

    €: Folgendes Abbruchkriterium scheint wohl zu funktionieren:

    while (readResult > 0);
    

    Gruß

    Ryo


Anmelden zum Antworten