2015-11-08 4 views
0

Я хочу написать программу, которая выполняет команду Linux ls. Я действительно хочу только ввести ls, а не /bin/ls, поэтому я хочу сделать это, используя execve (execvp - это не вариант).execve не принимает параметры среды

Я пробовал:

char *env[] = { "SHELL=/bin/bash", 
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games", 
"_=/usr/bin/env", 
(char *)0 }; 
execve(parmList[0], parmList, env); 

Но это не похоже на работу, ls не признается, но /bin/ls есть. Ничего плохого в parmList, потому что я пробовал это с execvp, и это сработало.

Любые идеи?

+0

1) Почему 'execvp' не вариант? 2) Вы посмотрели разницу между 'execvp' /' execvpe' и 'execv' /' execve'? –

+0

Пожалуйста, сообщите полные данные. Как объявляется/заполняется 'parmList'? Каков результат ('perror', возвращаемые значения ...)? – hexasoft

+0

1) Потому что я хочу, чтобы возможность сказать один день: я использую программу «abc», например. «/ home/user/programs» каждый день, и все, что я не хочу вводить в полный путь каждый раз. Тогда должно быть возможно просто добавить другую запись массива. 2) execvpe, похоже, работает, но моему компилятору это не нравится по какой-либо причине. –

ответ

2

Если parmList[0] содержит только ls, execve() не найдет команду ls, если она не находится в текущем каталоге.

С execve() значение PATH в окружающей среде несущественно - execve() не использует его. Вы должны использовать execvp() (или execvpe(), если он доступен) для выполнения команды в PATH текущего процесса.

+0

Что вы подразумеваете под нематериальным? –

+0

Я имею в виду, что с 'execve()', не имеет значения, что такое значение PATH, потому что оно не будет использоваться 'execve()'. Было бы важно, если вы используете 'execvp()'. (И это не ясно из руководства Linux или OpenBSD для 'execvpe()', значение которого используется PATH, которое установлено в аргументе 'envp' или преобладающем значении.) –

+0

Хорошо ... So нет шансов на достижение этого поведенья: Программа abc находится в/home/user/somedir. Я устанавливаю/home/user/somedir в массиве как параметр среды. Если я сейчас войду ./abc, он будет найден, даже если меня нет в каталоге/home/user/somedir? –

Смежные вопросы