Exit-Codes von Shell-Befehl in C auswerten

13/03/2008 - 12:23 von Jens Nixdorf | Report spam
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
Die oben angegebene Adresse ist OK, wird aber nicht gelesen. Wenn direkter
Mailkontakt gewünscht wird, bitte spamtrap gegen jens<punkt>nixdorf
austauschen. Danke.
 

Lesen sie die antworten

#1 Alexander Bartolich
13/03/2008 - 14:06 | Warnen spam
Jens Nixdorf schrieb:
[...]
int rc=0, status=0;
status=system("pump -i eth0");
if (WIFEXITED(status)!=NULL)
{
rc=WEXITSTATUS(status);
}



Die Bedingung im "if" ist ganz schlechter Stil. "NULL" steht für einen
Null-Zeiger. WIFEXITED liefert dagegen einen (signed) int. Wenn man
für die Makros typische Werte einsetzt, könnte so was rauskommen:

if ((((status) & 0x7f) == 0) != ((void*)0))

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.



Hmm. Du könntest das ganze mal systematisch angehen.

$ nl -ba a.c
1 #include <errno.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/wait.h>
5
6 static void test(const char* cmd)
7 {
8 printf("Starting %s ...", cmd);
9 const int status = system(cmd);
10 printf("errno =0x%x", errno);
11 printf("status =0x%x", status);
12 printf("WIFEXITED =%d", WIFEXITED(status));
13 if (WIFEXITED(status))
14 printf("WEXITSTATUS =%d", WEXITSTATUS(status));
15 printf("WIFSIGNALED =%d", WIFSIGNALED(status));
16 if (WIFSIGNALED(status))
17 {
18 printf("WTERMSIG =%d", WTERMSIG(status));
19 printf("WCOREDUMP =%d", WCOREDUMP(status));
20 }
21 printf("WIFSTOPPED =%d", WIFSTOPPED(status));
22 if (WIFSTOPPED(status))
23 printf("WSTOPSIG =%d", WSTOPSIG(status));
24 printf("WIFCONTINUED=%d", WIFCONTINUED(status));
25 }
26
27 int main()
28 {
29 test("true");
30 test("false");
31 test("gibts/nicht");
32 return 0;
33 }

$ gcc -Wall a.c && ./a.out

Starting true ...
errno =0x0
status =0x0
WIFEXITED =1
WEXITSTATUS =0
WIFSIGNALED =0
WIFSTOPPED =0
WIFCONTINUED=0

Starting false ...
errno =0x0
status =0x100
WIFEXITED =1
WEXITSTATUS =1
WIFSIGNALED =0
WIFSTOPPED =0
WIFCONTINUED=0

Starting gibts/nicht ...
sh: gibts/nicht: No such file or directory
errno =0x0
status =0x7f00
WIFEXITED =1
WEXITSTATUS 7
WIFSIGNALED =0
WIFSTOPPED =0
WIFCONTINUED=0

http://news.albasani.net/

Ähnliche fragen