[Kylix] Rückgabewert von system()
-
Hallo,
ich möchte eine Linux-Netzwerk-Konfiguration in ein Programm einbauen. Da gibt es zum Beispiel den Shellbefehl "pump -i eth0", der mir bei Verfügbarkeit eines DHCP-Servers gleich alles einstellt. Funktioniert der Shellaufruf, gibt er als Rückgabewert eine 0 zurück.
Rufe ich diesen Befehl jetzt über system() auf, also so:
int rc=0; rc=system("pump -i eth0");
dann ist rc aber nicht 0, sondern 5, warum auch immer. Der über system() abgeschickte Befehl hat aber funktioniert. Wer hilft mir auf die Sprünge?
Danke, Nix
-
Hallo
Es ist besser statt system direkte Betriebssystemfunktionen zu verwenden. Unter Windows wären dies Funktionen aus der WinAPI, unter *nix gibt es ähnliche.
Da das Thema nichts mit Builder oder Kylix zu tun hat verschieb ich dich mal ins Unix-Forum.
bis bald
akari
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Nix schrieb:
Hallo,
ich möchte eine Linux-Netzwerk-Konfiguration in ein Programm einbauen. Da gibt es zum Beispiel den Shellbefehl "pump -i eth0", der mir bei Verfügbarkeit eines DHCP-Servers gleich alles einstellt. Funktioniert der Shellaufruf, gibt er als Rückgabewert eine 0 zurück.
Rufe ich diesen Befehl jetzt über system() auf, also so:
int rc=0; rc=system("pump -i eth0");
dann ist rc aber nicht 0, sondern 5, warum auch immer. Der über system() abgeschickte Befehl hat aber funktioniert. Wer hilft mir auf die Sprünge?
Danke, Nix
system gibt nicht den exit code des programmes zurück sondern einen status der mit makros überprüft werden kann. siehe dazu: http://www.gnu.org/software/libc/manual/html_node/Process-Completion-Status.html#Process-Completion-Status
edit: dich interessiert womöglich also dieses makro insbesonders:
int WEXITSTATUS (int status)
If WIFEXITED is true of status, this macro returns the low-order 8 bits of the exit status value from the child process.
-
Danke für den Tipp. Leider kriege ich es aber nicht hin. Ich habe den Code jetzt wie folgt geändert:
int rc=0,status=0; status=system("pump -i eth0"); if (WIFEXITED(status)!=NULL) { rc=WEXITSTATUS(status); }
aber da läuft das Programm gar nicht in die if-Abfrage rein, weil WIFEXITED(status) scheinbar immer Null ist, obwohl das pump-Kommando scheinbar ordentlich beendet wird. Hab das Ganze auch mal ohne die if-Abfrage gemacht und ohne WIFEXITED-Auswertung, also so:
int rc=0,status=0; status=system("pump -i eth0"); rc=WEXITSTATUS(status);
dann bekomme ich von WEXITSTATUS immer eine Null, auch wenn ich das pump-Kommando absichtlich so schreibe, dass es einen Fehler produzieren muss. Das nützt mir ja dann auch nix.
mfG, Nix
-
Hallo,
hat sich erledigt, ich hab mich mal wieder selbst ver*****t
Kylix' interner Debugger hat zugeschlagen und die Rückgabewerte verändert. Und da ich das Programm immer aus der IDE gestartet habe, hab ich halt die falschen Werte bekommen. Ohne Debugger tut das Programm auch was es soll...mfG, Nix