5

次のパラメーターを入力する必要があります。

int execve(const char *filename, char *const argv[], char *const envp[]);

このプログラムを実行すると:

#include <unistd.h>
int main() {
        char *args[2];
        args[0] = "/bin/sh";
        args[1] = NULL;
        execve(args[0], args, NULL);
}

シェルは期待どおりに正しく生成されます。

私の問題は、次のように NULL を 2 番目のパラメーターとして渡すと、シェルが正しく生成されることです。

#include <unistd.h>

int main() {
        char *args[2];
        args[0] = "/bin/sh";
        args[1] = NULL;
        execve(args[0], NULL, NULL);
}

では、NULL の代わりに args ベクトル ("/bin/sh" + NULL) を 2 番目のパラメーターとして使用する目的は何ですか?

4

2 に答える 2

4

この行では、単に配列execve(args[0], NULL, NULL);の最初の要素を使用しています。argsのようなものを使用することもできますchar* command="/bin/sh"。それが定義された方法であるため、何かを渡す必要があります。execve()あなたの場合、NULL何も渡す必要がないので、あなたは渡します。

の 2 番目の引数のポイントは、execve()生成するコマンドに引数を渡すことです。shell の代わりに単に execute を実行したい場合ls、次の引数を渡すことができるとします。

#include <unistd.h>
int main() {
        char *args[2];
        args[0] = "/bin/ls";
        args[1] = "-lh";
        execve(args[0], args, NULL);
}

また、引用man execve

argv は、新しいプログラムに渡される引数文字列の配列です。 慣例により、これらの文字列の最初の文字列には、実行中のファイルに関連付けられたファイル名を含める必要があります。envp は文字列の配列であり、通常はキー=値の形式で、環境として新しいプログラムに渡されます。

于 2015-05-10T09:48:06.100 に答える