Выбрать главу

10.3. Информация о процессе

Ядро предоставляет значительное количество информации о каждом процессе и часть ее передается новым программам во время их загрузки. Вся эта информация образует среду выполнения для процесса.

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.

вернуться

18

Большинство систем передают окружение в виде параметра main(), но такой метод не включен в стандарт POSIX. Переменная environ — это метод, утвержденный POSIX.