2

Linux でexecve()fromを使用して新しいプロセスを生成しようとしています。unistd.h次のパラメーターを渡そうとしましたexecve("/bin/ls", "/bin/ls", NULL);が、結果が得られません。エラーも発生せず、プログラムは終了します。これが起こっている理由はありますか?rootおよび通常のユーザーとして起動してみました。私が使用する必要がある理由execve()は、アセンブリ呼び出しで動作させようとしているからです。

program: db "/bin/ls",0

mov eax, 0xb
mov ebx, program
mov ecx, program
mov edx, 0
int 0x80

ありがとうございました!

4

3 に答える 3

10

あなたが渡している引数execveは間違っています。2 番目と 3 番目は両方とも、単一のポインターではなく、NULL 番兵値を持つ char ポインターの配列でなければなりません。

つまり、次のようなものです。

#include <unistd.h>
int main (void) {
    char * const argv[] = {"/bin/ls", NULL};
    char * const envp[] = {NULL};
    int rc = execve ("/bin/ls", argv, envp);
    return rc;
}

それを実行すると、実際に現在のディレクトリ内のファイルのリストが取得されます。

于 2011-12-12T04:16:25.450 に答える
2

マニュアルページから、

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

したがって、あなたの場合の問題は、2番目と3番目の引数を正しく渡していないことです。

/* execve.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
    char *newargv[] = { NULL, "hello", "world", NULL };
    char *newenviron[] = { NULL };


newargv[0] = argv[1];

execve(argv[1], newargv, newenviron);


}
//This is a over-simplified version of the example in the man page

これを次のように実行します。

$ cc execve.c -o execve
$ ./execve ls
于 2011-12-12T04:17:49.190 に答える
1

もう一度読んでみてくださいman execve。間違った引数を渡しています。2 番目の引数がどうあるべきかに特に注意してください。

また、プログラムを下で実行すると、strace明るくなる可能性があります。

于 2011-12-12T04:11:32.750 に答える