2

execl 関数を使用する単純な C プログラムを作成しました。このプログラムを実行した後に期待しているのは、 の出力ですps -U myusername

ps -U myusernameターミナルに書き込むと、目的の結果が得られます。

呼び出すexecl("/bin/ps", "/bin/ps", "-U myusername", NULL)と、次のエラー メッセージが表示されますerror: improper list

ただし、 からスペースを削除-U myusernameし、次の方法で関数を呼び出すとexecl("/bin/ps", "/bin/ps", "-Umyusername", NULL)、正しい結果が得られます。

なぜこれが起こっているのか、どうすれば期待どおりの動作を実現できますか (これは単なる例です。実際に必要なのは、ユーザーがコマンドを入力し、それをコマンドと引数に分割して、最後に のようなものを呼び出すことexeclp("command", "command", "arguments", NULL)です)。

4

1 に答える 1

3

これは可変関数です。次のように呼び出すだけです:

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

またはあなたの場合

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

は関数に次のNULLように言います:「大丈夫です。これ以上引数はありません。」それを忘れると、未定義の動作が発生します。

さらに進むには: http://manpagesfr.free.fr/man/man3/stdarg.3.html

は と同じexeclp("/bin/ps", "/bin/ps", "-Uusername", NULL);なので、この行は機能します。コンソールに入力するだけで、その事実が証明されます;)ps -Uusernameps -U username

シェルに入力するかのように表示されるため、この行execlp("/bin/ps", "/bin/ps", "-U username", NULL);は機能しません。の有効な引数ではない単一の引数ですps '-U username''-U username'ps

于 2016-04-20T10:07:49.850 に答える