execv kehrt nicht zurück



  • debp schrieb:

    Wie lese ich denn nun den return-Wert eines Programmes ein?

    mfg

    So wie du es im Code gemacht hast. Nur der Parent darf das und der kann es mit
    WEXITSTATUS(status) machen.



  • Ja, aber das funktioniert ja nicht, da alle exec Varianten nicht zurückkehren.

    Zur Erklärung: Ich habe viele Programme, die lokal miteinander kommunizieren sollen. Daher brauche ich den return Wert (nicht einer Funktion, sondern eines _Programms_).

    mfg



  • debp schrieb:

    Ja, aber das funktioniert ja nicht, da alle exec Varianten nicht zurückkehren.

    Zur Erklärung: Ich habe viele Programme, die lokal miteinander kommunizieren sollen. Daher brauche ich den return Wert (nicht einer Funktion, sondern eines _Programms_).

    mfg

    Das wait wartet darauf, dass das Kind fertig ist. Und das wait speichert den Rückgabewert in status. Und das wird dann ausgewertet.



  • Mh.. ich wüsste nicht, wie mir das jetzt helfen sollte.

    Hast du einen Codeschnipsel oder sowas in der Richtung?

    Das wait speichert ja nicht den return Wert des _Programms_.

    mfg



  • Hier mal ein Programm, dass einen neuen Prozess startet, der direkt mit 42 terminiert.

    extern  "C" {
    #include <unistd.h>
    #include <sys/types.h> 
    #include <sys/wait.h>
    }
    
    #include <iostream>
    
    int main()
    {
    
       switch (fork()) {
    
          case -1:
             std::cerr << "Creation of new process failed\n";
             exit(-1);
          case  0:         //Childprocesss
             std::cout << "Childprocess started returning 42\n";
             return 42;
          default:
             int status;
             if (wait(&status) < 0) {
                std::cerr << "Error waiting for child process\n";
             }
             std::cout << "Child terminated with return code: " << WEXITSTATUS(status) << "\n";
       }
       return 0;
    }
    


  • *waahh*

    Ich red gegen 'ne Wand 😉

    Beispiel:

    // programm1
    int main(int argc, char** argv)
    {
        if(atoi(argv[1]) == 1)
            return 0;
    
        return 1;
    }
    
    // programm2, welches programm1 aufrufen und return wert abfangen soll
    int main()
    {
        execl("./programm1", "./programm1", "arg", "arg".., 0);
    
    // dann brauch ich den return wert des programms 1
        if(/*return-wert des programms*/)
        { ..... }
    
        return 0;
    }
    

    Verstehst du jetzt was ich meine?

    PS: Ich weiß, dass execl nicht mehr zurückkehrt, aber das habe ich ja sogar im ersten Posting gesagt.

    mfg



  • Mein Beispiel hatte schon alles:

    extern  "C" {
    #include <unistd.h>
    #include <sys/types.h> 
    #include <sys/wait.h>
    }
    
    #include <iostream>
    
    int main()
    {
    
       switch (fork()) {
    
          case -1:
             std::cerr << "Creation of new process failed\n";
             exit(-1);
          case  0:         //Childprocesss
             execl("./programm1", "./programm1", "arg", "arg", 0);
             exit(-1);
          default:
             int status;
             if (wait(&status) < 0) {
                std::cerr << "Error waiting for child process\n";
             }
             std::cout << "Der Rückgabewert von programm1 ist: " << WEXITSTATUS(status) << "\n";
       }
       return 0;
    }
    


  • case  0:         //Childprocesss
             execl("./programm1", "./programm1", "arg", "arg", 0);
             exit(-1);
    

    Nach der execl-Zeile stoppt das Programm (bzw. child-Prozess). exit(-1) wird nicht aufgerufen.

    mfg



  • debp schrieb:

    case  0:         //Childprocesss
             execl("./programm1", "./programm1", "arg", "arg", 0);
             exit(-1);
    

    Nach der execl-Zeile stoppt das Programm (bzw. child-Prozess). exit(-1) wird nicht aufgerufen.

    mfg

    Und wo ist das Problem? Hast du den Code mal ausgeführt? was ist passiert?



  • *confused*

    Nanu, jetzt klappt es... ;).

    Ich war mir 99% sicher, dass ich das vorher schon so hatte.

    Vielen Dank :).

    Mit freundlichen Grüßen
    debp


Anmelden zum Antworten