2016-04-20 2 views
1

Ich schrieb ein einfaches C-Programm, das die execl-Funktion verwendet. Nach dem Ausführen dieses Programms erwarte ich die Ausgabe von ps -U myusername.Aufruf von "ps" -Befehl mit Argumenten mit execl hat ein unerwartetes Verhalten

Wenn ich ps -U myusername im Terminal schreibe, bekomme ich das gewünschte Ergebnis.

Beim Aufruf execl("/bin/ps", "/bin/ps", "-U myusername", NULL) erhalte ich die folgende Fehlermeldung error: improper list.

Allerdings, wenn ich den Speicherplatz von -U myusername entfernen, und rufen Sie die Funktion auf folgende Weise: execl("/bin/ps", "/bin/ps", "-Umyusername", NULL), bekomme ich das richtige Ergebnis.

Warum passiert das und wie kann ich das erwartete Verhalten erreichen (dies ist nur ein einfaches Beispiel; was ich eigentlich will ist, den Benutzer den Befehl eingeben und in Befehl und Argumente aufteilen und schließlich wie execlp("command", "command", "arguments", NULL) aufrufen.)

Antwort

2

Es ist eine variadic Funktion. nennen Sie es einfach wie folgt aus:

execlp("command", "command", "first arg", "second arg" /*, etc*/, NULL); 

oder in Ihrem Fall

execlp("/bin/ps", "/bin/ps", "-U", "username", NULL); 

Die NULL auf die Funktion sagt: „Es ist in Ordnung, es keine weiteren Argumente sind.“ Wenn Sie es vergessen, gibt es ein undefiniertes Verhalten.

Um weiter zu gehen: http://manpagesfr.free.fr/man/man3/stdarg.3.html

Die Linie execlp("/bin/ps", "/bin/ps", "-Uusername", NULL); funktioniert, weil ps -Uusername die gleiche wie ps -U username ist. Geben Sie es einfach in die Konsole ein, es wird Ihnen diese Tatsache beweisen;)

Die Zeile execlp("/bin/ps", "/bin/ps", "-U username", NULL); funktioniert nicht, weil es so ist, als ob Sie ps '-U username' in Ihre Shell eingeben. '-U username' ist ein einziges Argument, das ist kein gültiges Argument ps

+0

Vielen Dank! Es funktioniert. Ich wusste nicht, dass ich die 'execl' Funktion auf diese Weise aufrufen kann. –

+0

Gern geschehen. Vergessen Sie nicht, die Antwort zu bestätigen, wenn es in Ordnung ist. – Boiethios

+0

Dies beantwortet nicht den ersten Teil der Frage: * "Warum ist das passiert" * – user694733

Verwandte Themen