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