Основы программирования в Linux
Variable FRED has value helloКомандная оболочка принимает начальные присвоения значений переменным как временные изменения переменных окружения. Во второй части предыдущего примера программа
выполняется в окружении, где у переменнойenvironесть значение.FREDНапример, в будущей версии приложения, управляющего базой данных компакт-дисков, вы сможете изменить переменную окружения, скажем
, обозначающую базу данных, которую нужно использовать. Каждый пользователь затем сможет задать собственное значение по умолчанию или применить команду оболочки для задания значения при очередном выполнении приложения:CDDB$ <b>CDDB=mycds; export CDDB</b>$ cdappили
$ <b>CDDB=mycds cdapp</b>ПримечаниеПеременные окружения — противоречивое благо, и их следует применять с осторожностью. Эти переменные более "закрыты" от пользователя, чем опции командной строки, и это может затруднить отладку. По смыслу переменные окружения подобны глобальным переменным, поэтому они могут изменять поведение программы, что порой приводит к неожиданным результатам.
Переменная environ
Как вы уже знаете, окружение программы формируется из строк вида имя=значение. Этот массив строк становится доступен программе непосредственно из переменной environ, которая объявляется, как
<b>#include <stdlib.h></b>
<b>extern char **environ;</b>Выполните упражнение 4.5.
Упражнение 4.5. ПеременнаяenvironДалее приведена программа showenv.c, использующая переменную environ для вывода переменных окружения.
#include <stdlib.h>#include <stdio.h>extern char **environ;int main() {char **env = environ;while (*env) {printf("%s\n", *env);env++;}exit(0);}Когда вы выполните программу в системе Linux, то получите нечто, похожее на следующий вывод, который немного сокращен. Количество, порядок отображения и значения этих переменных зависят от версии операционной системы, применяемой командной оболочки и настроек пользователя в момент выполнения программы.
$ <b>./showenv</b>HOSTNAME=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 г. В других системах применяют точки отсчета иных эпох.
Время задается с помощью типа
. Это целочисленный тип, достаточный для хранения дат и времени в секундах. В Linux-подобных системах это типtime_t(длинное целое), определенный вместе с функциями, предназначенными для обработки значений времени, в заголовочном файле time.h.long integerПримечаниеНе думайте, что для хранения времени достаточно 32 битов. В системах UNIX и Linux, использующих 32-разрядный тип
, временное значение "будет превышено" в 2038 г. Мы надеемся, что к тому времени системы перейдут на типtime_t, содержащий более 32 битов. Недавнее широкое внедрение 64-разрядных процессоров превращает это практически в неизбежность.time_t<b>#include <time.h></b><b>time_t time(time_t *tloc);</b>Вы можете найти низкоуровневое значение времени, вызвав функцию
, которая вернет количество секунд с начала эпохи (упражнение 4.6). Она также запишет возвращаемое значение по адресу памяти, на который указывает параметрtime, если он — непустой указатель.tlocУпражнение 4. ФункцияtimeДалее для демонстрации функции 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 %ld\n", the_time);sleep(2);}exit(0);}Когда вы запустите программу, она будет выводить низкоуровневое значение времени каждые 2 секунды в течение 20 секунд.