Hallo, ich möchte wie im Subject beschrieben, den Exit-Code eines Shell-Kommandos in C auswerten. In diesem Fall handelt es sich um eine Netzwerk-Konfiguration mit dem Shellbefehl "pump -i eth0", der bei Verfügbarkeit eines DHCP-Servers gleich alles einstellt und bei Erfolg eine Null zurückgibt. Hier mein erster Versuch: int rc=0; rc=system("pump -i eth0"); Das hat nicht funktioniert, weil in rc eine 5 erscheint. Der nächste Versuch war mit dem Makro WEXITSTATUS: int rc=0, status=0; status=system("pump -i eth0"); rc=WEXITSTATUS(status); In diesem Fall bleibt rc immer Null, auch wenn ich den Shellbefehl fehlerhaft schreibe, so dass er in der Bash -1 zurückgeben würde. Dann hab ich nach diversen man-Pages und Googleien noch einen dritten Versuch gemacht: int rc=0, status=0; status=system("pump -i eth0"); if (WIFEXITED(status)!=NULL) { rc=WEXITSTATUS(status); } Aber da läuft das Programm überhaupt nie in die IF-Abfrage rein, weil WIFEXITED scheinbar immer eine Null zurückgibt, unabhängig davon, ob der Shellbefehl erfolgreich beendet wurde oder nicht. Bei allen o.a. Varianten wird der Befehl übrigens tatsächlich ausgeführt. Wo liegt da mein Denkfehler? Oder wie bekomme ich sonst $? von dem Shellbefehl in mein Programm (mal abgesehen von der Ablage in temp. Dateien). Danke, Jens --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Donnerstag, 13. März 2008 schrieb Jens Nixdorf:
int rc=0; rc=system("pump -i eth0");
Das hat nicht funktioniert, weil in rc eine 5 erscheint. Der nächste Versuch war mit dem Makro WEXITSTATUS:
So, da habe ich mich schön selber verarscht. Wenn man das Programm immer aus der IDE heraus startet, und dabei automatisch der Debugger läuft, dann bekommt man eben nicht die richtigen Rückgabewerte. Ohne Debugger schon. Hmpf. mfG, Jens --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Jens Nixdorf wrote:
Am Donnerstag, 13. März 2008 schrieb Jens Nixdorf:
int rc=0; rc=system("pump -i eth0");
Das hat nicht funktioniert, weil in rc eine 5 erscheint. Der nächste Versuch war mit dem Makro WEXITSTATUS:
So, da habe ich mich schön selber verarscht. Wenn man das Programm immer aus der IDE heraus startet, und dabei automatisch der Debugger läuft, dann bekommt man eben nicht die richtigen Rückgabewerte. Ohne Debugger schon. Hmpf.
Du solltest aber trotzdem WEXITSTATUS() auf den Rückgabewert anwenden. Aus der Manpage: The value returned is -1 on error (e.g. fork(2) failed), and the return status of the command otherwise. This latter return status is in the format specified in wait(2). Thus, the exit code of the command will be WEXITSTATUS(status). In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127). If the value of command is NULL, system() returns non-zero if the shell is available, and zero if not. system() does not affect the wait status of any other children. HTH, Bernhard --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
Am Donnerstag, 13. März 2008 schrieb Bernhard Walle:
Du solltest aber trotzdem WEXITSTATUS() auf den Rückgabewert anwenden.
Mache ich. Hat ein wenig gedauert, bis ich verstanden habe, dass in system nur mehr oder weniger "Erfolg" oder "Misserfolg" drinsteht und in WEXITSTATUS der "wirkliche" Rückgabewert, aber irgendwann klappts sogar bei mir ;) mfG, Jens --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
* Jens Nixdorf [Donnerstag 13 März 2008 18:16]:
Am Donnerstag, 13. März 2008 schrieb Bernhard Walle:
Du solltest aber trotzdem WEXITSTATUS() auf den Rückgabewert anwenden.
Mache ich. Hat ein wenig gedauert, bis ich verstanden habe, dass in system nur mehr oder weniger "Erfolg" oder "Misserfolg" drinsteht und in WEXITSTATUS der "wirkliche" Rückgabewert, aber irgendwann klappts sogar bei mir ;)
Es ist IMO auch blöd zwar mit system() einen portable Funktion zu haben, die dann aber unportable Rückgabewerte liefert. Aber so ist das Leben. Bernhard --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-programming-de+help@opensuse.org
participants (2)
-
Bernhard Walle
-
Jens Nixdorf