Ядро предоставляет значительное количество информации о каждом процессе и часть ее передается новым программам во время их загрузки. Вся эта информация образует среду выполнения для процесса.
10.3.1. Аргументы программы
Есть два типа значений, передаваемых новым программам при их запуске: аргументы командной строкии переменные окружения. Для их использования установлено множество соглашений, но система сама по себе не придерживается их автоматически. Однако хорошим тоном считается придерживаться этих соглашений, чтобы помочь вашим программам попасть в мир Unix.
Аргументы командной строки — это набор строк, передаваемый программе. Обычно они представляют собой текст, набранный вслед за именем команды в оболочке, с необязательными аргументами, начинающимися с символа "минус" (-
).
Переменные окружения — это набор пар "имя-значение". Каждая пара представляет отдельную строку в форме ИМЯ = ЗНАЧЕНИЕ
, и набор таких строк образует окружение (environment) программы. Например, домашний каталог текущего пользователя обычно указан в переменной окружения HOME, поэтому программы, скажем, пользователя Joe часто запускаются, имея в своем окружении HOME=/home/joe
.
И аргументы, и окружение становятся доступными программе при запуске. Аргументы командной строки передаются в виде параметров главной функции программы — main()
, в то время как указатель на окружение помещается в глобальную переменную environ
, которая определена в [18] Большинство систем передают окружение в виде параметра main() , но такой метод не включен в стандарт POSIX. Переменная environ — это метод, утвержденный POSIX.
.
Ниже представлен полный прототип функции 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
. Это объявление находится в , поэтому вам не обязательно объявлять его самостоятельно.
Наиболее общий способ проверки элементов окружения — это вызов 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 также поддерживает. Это более гибкий и удобный способ добавления переменных к окружению.
Читать дальше