Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform | страница 27
Версии с суффиксом «p» будут искать исполняемый модуль программы в списке каталогов, приведенном в переменной окружения PATH. Вы, вероятно, отметили, что во всех примерах местоположение исполняемых модулей строго определено — >/bin/ls
и >/usr/bin/spellcheck
. А как быть с другими исполняемыми модулями? Если вы не хотите сразу определить точный путь к нужной программе, было бы лучше сделать так, чтобы места поиска исполняемых модулей вашей программе сообщил пользователь. Стандартная системная переменная PATH для этого и предназначена. Ниже приведено ее значение для минимальной системы:
>PATH=/proc/boot:/bin
Это сообщает командному интерпретатору, что когда я набираю команду, он в первую очередь должен просмотреть каталог >/proc/boot/
, и если не сможет найти команду там, то должна просмотреть каталог бинарных файлов >/bin
. Переменная PATH представляет собой разделяемый двоеточиями список каталогов для поиска команд. К переменной PATH вы можете добавлять столько элементов, сколько пожелаете, но имейте в виду, что при поиске файла будут проанализированы все элементы (в приведенной последовательности).
Если вы не знаете путь к выполнимой программе, вы можете использовать варианты с суффиксом «p».
Например:
>// Использование явного пути:
>execl("/bin/ls", "/bin/ls", "-l", "-t", "-r", NULL);
>// Поиск пути в PATH:
>execp("ls", "ls", "-l", "-t", "-r", NULL) ;
Если функция execl() не сможет найти >ls
в >/bin
, она завершится с ошибкой. Функция execlp() просмотрит все каталоги, указанные в PATH, в поисках >ls
, и завершится с ошибкой только в том случае, если не сможет найти ls ни в одном из этих каталогов. Это также прекрасная вещь для многоплатформенной поддержки — вашей программе не обязательно знать имена каталогов, принятых на разных машинах, она просто выполнит поиск.
А что произойдет, если сделать так?
>execlp("/bin/ls", "ls", "-l", "-t", "-r", NULL);
Выполняет ли этот вызов поиск в окружении? Нет. Вы явно указали execlp() имя пути, что отменяет правило поиска в PATH. Если >ls
не будет найдена в >/bin
(а здесь это будет именно так), то никаких других попыток поиска не выполняется — эта ситуация подобна варианту с использованием функции execl()).
Опасно ли смешивать явный путь с простым именем команды (например, указывать путь как >/bin/ls
, а имя — как >ls
вместо >/bin/ls
)? Обычно нет, потому что:
• значительное число программ так или иначе игнорирует >argv[0]
;
• те программы, поведение которых зависит от их имени, обычно вызывают функцию