execve () не удалось запустить программу в C - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь создать новый процесс, используя execve() из unistd.h в Linux. Я попытался передать следующие параметры 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

Спасибо!

Ответы [ 3 ]

9 голосов
/ 12 декабря 2011

Аргументы, которые вы передаете execve, неверны.И второй, и третий должны быть массивом указателей на символы со значением NULL Sentinel, а не одним указателем.

Другими словами, что-то вроде:

#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;
}

Когда я запускаю это, я действительно получаю список файлов в текущем каталоге.

2 голосов
/ 12 декабря 2011

Из man страниц,

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
1 голос
/ 12 декабря 2011

Попробуйте прочитать man execve еще раз.Вы передаете неверные аргументы.Обратите особое внимание на то, каким должен быть второй аргумент.

Кроме того, запуск вашей программы под strace может быть освещен.

...