Основы программирования в Linux - Страница 68
Variable FRED has value helloКомандная оболочка принимает начальные присвоения значений переменным как временные изменения переменных окружения. Во второй части предыдущего примера программа
environFREDНапример, в будущей версии приложения, управляющего базой данных компакт-дисков, вы сможете изменить переменную окружения, скажем
CDDB$ CDDB=mycds; export CDDB$ cdappили
$ CDDB=mycds cdappПеременные окружения — противоречивое благо, и их следует применять с осторожностью. Эти переменные более "закрыты" от пользователя, чем опции командной строки, и это может затруднить отладку. По смыслу переменные окружения подобны глобальным переменным, поэтому они могут изменять поведение программы, что порой приводит к неожиданным результатам.
Переменная environ
Как вы уже знаете, окружение программы формируется из строк вида имя=значение. Этот массив строк становится доступен программе непосредственно из переменной environ, которая объявляется, как
#include <stdlib.h>
extern char **environ;
Выполните упражнение 4.5.
environДалее приведена программа showenv.c, использующая переменную environ для вывода переменных окружения.
#include <stdlib.h>#include <stdio.h>extern char **environ;int main() { char **env = environ; while (*env) { printf("%sn", *env); env++; } exit(0);}Когда вы выполните программу в системе Linux, то получите нечто, похожее на следующий вывод, который немного сокращен. Количество, порядок отображения и значения этих переменных зависят от версии операционной системы, применяемой командной оболочки и настроек пользователя в момент выполнения программы.
$ ./showenvHOSTNAME=tilde.provider.comLOGNAME=neilMAIL=/var/spool/mail/neilTERM=xtermHOSTTYPE=i386PATH=/usr/local/bin:/bin:/usr/bin:HOME=/usr/neilLS_OPTIONS=-N --color=tty -T 0SHELL=/bin/bashOSTYPE=Linux...Как это работает
Для вывода всего окружения программа в цикле обращается к переменной
environВремя и дата
Программе часто полезно иметь возможность определить время и дату. Возможно, она хочет зарегистрировать длительность собственного выполнения или ей нужно изменять свое поведение в определенные моменты времени. Например, игра может отказываться запускаться в рабочие часы или программа резервного копирования по расписанию хочет дождаться ранних часов, прежде чем начать резервное копирование в автоматическом режиме.
Во всех системах UNIX применяется одна и та же точка отсчета времени и дат: полночь по Гринвичу (GMT) на 1 января 1970 г. Это "начало эпохи UNIX", и ОС Linux — не исключение. Время в системе Linux измеряется в секундах, начиная с этого момента времени. Такой способ обработки аналогичен принятому в системе MS-DOS за исключением того, что эпоха MS-DOS началась в 1980 г. В других системах применяют точки отсчета иных эпох.
Время задается с помощью типа
time_tlong integerНе думайте, что для хранения времени достаточно 32 битов. В системах UNIX и Linux, использующих 32-разрядный тип
time_ttime_t#include <time.h>time_t time(time_t *tloc);Вы можете найти низкоуровневое значение времени, вызвав функцию
timetloctimeДалее для демонстрации функции time приведена простая программа envtime.c.
#include <time.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>int main() { int i; time_t the_time; for (i = 1; i <= 10; i++) { the_time = time((time_t *)0); printf("The time is %ldn", the_time); sleep(2); } exit(0);}Когда вы запустите программу, она будет выводить низкоуровневое значение времени каждые 2 секунды в течение 20 секунд.