Книга: Разработка приложений в среде Linux. Второе издание
10.3.1. Аргументы программы
10.3.1. Аргументы программы
Есть два типа значений, передаваемых новым программам при их запуске: аргументы командной строки и переменные окружения. Для их использования установлено множество соглашений, но система сама по себе не придерживается их автоматически. Однако хорошим тоном считается придерживаться этих соглашений, чтобы помочь вашим программам попасть в мир Unix.
Аргументы командной строки — это набор строк, передаваемый программе. Обычно они представляют собой текст, набранный вслед за именем команды в оболочке, с необязательными аргументами, начинающимися с символа "минус" (-
).
Переменные окружения — это набор пар "имя-значение". Каждая пара представляет отдельную строку в форме ИМЯ=ЗНАЧЕНИЕ
, и набор таких строк образует окружение (environment) программы. Например, домашний каталог текущего пользователя обычно указан в переменной окружения HOME, поэтому программы, скажем, пользователя Joe часто запускаются, имея в своем окружении HOME=/home/joe
.
И аргументы, и окружение становятся доступными программе при запуске. Аргументы командной строки передаются в виде параметров главной функции программы — main()
, в то время как указатель на окружение помещается в глобальную переменную environ
, которая определена в <unistd.h>
[18].
Ниже представлен полный прототип функции main()
в мире Linux, Unix и языка ANSI/ISO С.
int main(int argc, char *argv[]);
Возможно, вас удивит, что main()
возвращает значение (отличное от void
). Это значение, возвращаемое функцией main(), передается родительскому процессу после завершения данного. По соглашению 0 означает, что процесс завершен успешно, а ненулевое значение означает возникновение сбоя. При этом принимаются во внимание только младшие 8 бит из этого кода возврата. Отрицательные значения от -1 до -128 зарезервированы для ненормального завершения процессов по инициативе другого процесса или ядра системы. Код выхода 0 сигнализирует об успешном завершении, а значения от 1 до 127 говорят о том, что программа завершена по ошибке.
Первый параметр, argc
, содержит количество аргументов командной строки, переданных программе, тогда как argv
— массив указателей на строки — хранит сами аргументы. Первый элемент в массиве, argv[0]
, содержит имя вызванной программы (хотя и не обязательно полный путь к ней). В элементе argv[argc-1]
расположен указатель на завершающий аргумент командной строки, а argv[argc]
содержит NULL
.
Чтобы получить прямой доступ к окружению, используйте следующую глобальную переменную:
extern char *environ[];
Это представляет environ
как массив указателей на каждый элемент программного окружения (помните, каждый элемент — это пара ИМЯ=ЗНАЧЕНИЕ
), и финальный элемент массива содержит NULL
. Это объявление находится в <unistd.h>
, поэтому вам не обязательно объявлять его самостоятельно.
Наиболее общий способ проверки элементов окружения — это вызов getenv
, который исключает непосредственное обращение к переменной environ
.
const char *getenv(const char * name);
Единственный параметр getenv()
— это имя переменной окружения, значение которой интересует. Если переменная существует, getenv()
вернет указатель на ее значение. Если переменная не существует в текущем окружении (то есть окружении, на которое указывает environ
), функция вернет NULL
.
Linux предоставляет два способа добавления строк в программное окружение: setenv()
и putenv()
. POSIX определяет только putenv()
, что делает его более переносимым.
int putenv(const char * string);
Переданный функции параметр string
должен иметь форму ИМЯ=ЗНАЧЕНИЕ
. putenv()
добавляет переменную по имени ИМЯ
к текущему окружению и присваивает ей значение ЗНАЧЕНИЕ
. Если окружение уже содержит переменную ИМЯ
, ее значение изменяется на ЗНАЧЕНИЕ
.
BSD определяет функцию setenv()
, которую Linux также поддерживает. Это более гибкий и удобный способ добавления переменных к окружению.
int setenv(const char * name, const char * value, int overwrite);
Здесь имя и новое значение переменной окружения передаются раздельно, что обычно программам делать проще. Если overwrite
равно 0, окружение не модифицируется, если оно уже содержит переменную по имени name
. В противном случае значение переменной модифицируется, как и в putenv()
.
Ниже приведен короткий пример использования обеих функций. Оба вызова делают одно и то же, заменяя переменную окружения PATH
для запущенной программы.
putenv("PATH=/bin:/usr/bin");
setenv("PATH","/bin:/usr/bin", 1);
- Сердечные аргументы
- 4.2. Представление базовой структуры программы
- Листинг 3.3. (fork.c) Ветвление программы с помощью функции fork()
- Аргументы программы
- 6.2 Аргументы программы: vis версия 2
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Аргументы функции в Python
- 1.2.5. Пример программы
- 24.7. Использование программы-твикера
- Часть III Прикладные программы
- Цикл создания программы