Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГЗ.docx
Скачиваний:
3
Добавлен:
13.09.2019
Размер:
277.44 Кб
Скачать

Окружение.

Окружение (environment) – это набор специфичных для конкретного пользователя пар переменная=значение. Эти пары называют переменными окружения. Чтобы посмотреть что собой представляет окружение в действительности, можно использовать следующую команду:

$ env

На экран будет выведено окружение программы env. В современных Linux-дистрибутивах окружение представлено десятками переменных, но широко используются только некоторые из них:

USER – имя пользователя;

HOME – домашний каталог;

PATH – список каталогов, в которых осуществляется поиск исполняемых файлов программ;

SHELL – используемая командная оболочка;

PWD – текущий каталог.

Следующая команда позволяет просмотреть значение конкретной переменной:

$ echo $VARIABLE

Здесь VARIABLE – это имя переменной. Вообще говоря, оболочка вместо записи $VARIABLE всегда подставляет значение соответствующей переменной окружения.

Программа может читать окружения двумя способами:

1. Посредством внешней переменной environ, представляющей собой массив строк ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ. Эта переменная объявлена в заголовочном файле unistd.h.

2. При помощи функции getenv(), которая возвращает значение указанной переменной окружения. Эта функция объявлена в заголовочном файле stdlib.h

Фнукция getenv() используется для получения значения конкретной переменной.

Синтакис:

#include <stdlib.h>

char *getenv(const char *name);

Ее аргументом является имя переменной name окружения, которую нужно искать, такое как «HOME» или «PATH». Если такая переменная существует, getenv() возвращает указатель на строковое значение. Если нет, возвращается NULL.

Внешняя переменная environ обычно служит для просмотра набора переменных окружения предоставляет доступ таким же способом, как argv предоставляет доступ к аргументам командной строки. Необходимо самим объявлять переменную. Хотя она и стандартизирована POSIX, environ намеренно не объявлена ни в одном стандартном заголовочном файле. Объявление

extern char **environ;

Как и в argv, завершающим элементом environ является NULL. Однако, здесь нет переменной «числа строк окружения», которая соответствовала бы argc.

Переменные хранятся в окружении в случайном порядке. Хотя некоторые оболочки UNIX хранят переменные окружения в отсортированном по именам переменных виде, это формально не требуется, и многие оболочки не сортируют их.

Можно получить доступ к окружению, объявив третий параметр main():

int main(int argc, char *argv[], char *envp[])

Затем можно использовать envp также, как environ.

Следующие несколько функций позволяют устанавливать значения переменных окружения, изменять эти значения или удалять их:

int setenv(const char *name, const char *value, int overwrite); // установить переменную окружения

int putenv(char *string); // установить переменную окружения, использует строку.

void unsetenv(const char *name); // удалить переменную окружения.

int clearenv(void); // очистить все окружение.

Разбор командной строки.

Для разбора опций и их аргументов средствами языка С служит функция getopt() и ассоциированные с ней внешние переменные. Функция getopt() читает командную строку и возвращает имя очередной опции из цепочки опций, указанных в строке optstring.

Внешние переменные – переменные, которые объявляются в одном файле со спецификатором extern, а используются в другом.

#include<unistd.h>

int getopt(int argc, char *const argv[], const char *optstring);

extern char *optarg;

extern int optind, opterr, optopt;

- аргументы argc (количество аргументов командной строки) и argv (массив указателей на эти аргументы) задают командную строку в том виде, в котором она передается функции main();

- optstring является цепочкой имен опций;

- переменная optind (c начальным значением 1) служит индексом в массиве argv[].

Получая на вход число параметров команды (argc), массив указателей на эти параметры (argv) и строку с опциями (optstring), getopt() возвращает первый параметр и задает некоторые внешние переменные. При повторном вызове с теми же аргументами функция вернет следующий параметр и задаст внешнюю переменную. Если больше не будет найдено опций, которые надо распознать, то функция вернет -1, что означает завершение обработки команды.

Внешние переменные, задаваемые функцией getopt(), включают в себя:

- optarg – указатель на текущий аргумент, если таковой имеется (строковое значение аргумента).

- optind – индекс на следующий указатель argv, который будет обработан при следующем вызове getopt().

- optopt – переменная, в которой будет находится обнаруженный недействительный символ опции (нераспознанная опция) или опцию с отсутствующим требуемым аргументом.

Строка с опциями optstring состоит из одного символа для каждого аргумента командной строки.

Можно вызывать getopt() до тех пор, пока она не вернет -1; любые остальные аргументы команды обычно являются именами файлов или чем-либо другим, необходимым для программы.

Для использования getopt() ее вызывают повторно в цикле, до тех пор, пока она не вернет -1. Каждый раз обнаружив действительный символ опции, функция возвращает этот символ. В результате функция getopt() возвращает имя очередной опции с числа перечисленных в цепочке optstring (если такое удалось выделить). Если за какой либо буквой в строке optstring следует двоеточие, значит эта опция принимает аргумент. По наличию у опции аргумента показатель на него помещается в переменную optarg с соответствующим увеличением значения optind. Если у опции аргумент отсутствует, а на первом месте в optstring задано двоеточие, оно и служит результатом. Если встретилось имя опции, не перечисленное opstring, или у опции нет аргумента, а на первом месте в opstring задано не “:”, то результатом станет “?”.

В любой из перечисленных выше ошибочных ситуациях в переменную optopt помещается имя «проблемной» опции. Кроме того, в стандартный протокол выдается диагностической сообщение (обычно getopt печатает сообщение об ошибке, когда находит неверный параметр. Присваивание нуля переменной opterr выключает это свойство). Для подавления выдачи следует присвоить переменной opterr нулевое значение. То есть если getopt() не распознала символ опции, то она выводит на стандартный поток ошибок соответствующее сообщение, заносит символ в optopt и возвращает "?". Вызывающая программа может предотвратить вывод сообщения об ошибке, установив нулевое значение opterr.

Когда переменная opterr не равна нулю (по умолчанию так и есть), getopt() сама выводит сообщения в случае недействительной опции или отсутствия аргумента. Если же opterr равен нулю, то в случае возникновения ошибки getopt() возвращает "?" или ":" в зависимости от того найдена

недействительная опция или пропущен обязательный аргумент опции, в переменной optopt будет находится обнаруженный недействительный символ. 

Когда все аргументы с опциями обработаны, переменная optind указывает, где в конца массива argv можно найти оставшиеся аргументы командной строки. И программа может вывести все оставшиеся аргументы, начиная с номера, хранящегося в переменной optind.

Наконец, если при вызове getopt() показатель argv[optind] не определяет начало опции (например, он пуст или первый символ указанной цепочки отличен от знака минус), результат равный -1 как признак того, что разбор опций закончен.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]