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