Почему мой execve () работает только тогда, когда аргументы включают / bin /? - PullRequest
0 голосов
/ 18 февраля 2020

execve() работает только тогда, когда /bin/ является префиксом первого аргумента

например, ./test.out ls ничего не находит, в то время как ./test.out /bin/ls работает

execve (argv [1], args , getenv ("ПУТЬ"))

Ответы [ 2 ]

3 голосов
/ 18 февраля 2020

execve() не ищет PATH исполняемого файла. Вы должны использовать execvp() для этого. p в названии означает PATH.

0 голосов
/ 18 февраля 2020

execve не выполняет поиск в каталогах PATH. Первый параметр должен ссылаться на фактический файл, доступный из текущего каталога, поэтому он должен содержать / символов, если файл не находится в текущем каталоге.

Linux поддерживает execvpe в качестве GNU расширение, которое представляет собой нечто среднее между функциями execve и execvp POSIX. p означает, что он будет искать файл PATH, если в нем нет символов /. (Если он содержит / символов, он будет таким же, как и не p версия.) e означает, что новая функция передана функции в третьем параметре.

OP's Код передает среду в функцию execve, которая содержит только переменную среды PATH из исходной среды. Если это и есть намерение, тот же эффект можно выполнить в POSIX-совместимом режиме, удалив среду перед вызовом execvp. Это использует переменную extern char **environ;, объявленную #include <unistd.h>:

char *env_p = getenv("PATH");
char *args[] = {argv[1], argv[2], NULL};

if (environ[0]) {
    environ[0] = env_p;
    environ[1] = NULL;
}

if (execvp(argv[1], args) < 0) {
    perror("execvp");
    exit(EXIT_FAILURE);
}
...