Литмир - Электронная Библиотека
Содержание  
A
A

Variable FRED has value hello

Командная оболочка принимает начальные присвоения значений переменным как временные изменения переменных окружения. Во второй части предыдущего примера программа

environ
выполняется в окружении, где у переменной
FRED
есть значение.

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

CDDB
, обозначающую базу данных, которую нужно использовать. Каждый пользователь затем сможет задать собственное значение по умолчанию или применить команду оболочки для задания значения при очередном выполнении приложения:

$ <b>CDDB=mycds; export CDDB</b>

$ cdapp

или

$ <b>CDDB=mycds cdapp</b>

Примечание

Переменные окружения — противоречивое благо, и их следует применять с осторожностью. Эти переменные более "закрыты" от пользователя, чем опции командной строки, и это может затруднить отладку. По смыслу переменные окружения подобны глобальным переменным, поэтому они могут изменять поведение программы, что порой приводит к неожиданным результатам.

Переменная environ

Как вы уже знаете, окружение программы формируется из строк вида имя=значение. Этот массив строк становится доступен программе непосредственно из переменной environ, которая объявляется, как

<b>#include &lt;stdlib.h&gt;</b>

<b>extern char **environ;</b>

Выполните упражнение 4.5.

Упражнение 4.5. Переменная
environ

Далее приведена программа showenv.c, использующая переменную environ для вывода переменных окружения.

#include &lt;stdlib.h&gt;

#include &lt;stdio.h&gt;

extern char **environ;

int main() {

 char **env = environ;

 while (*env) {

  printf(&quot;%s\n&quot;, *env);

  env++;

 }

 exit(0);

}

Когда вы выполните программу в системе Linux, то получите нечто, похожее на следующий вывод, который немного сокращен. Количество, порядок отображения и значения этих переменных зависят от версии операционной системы, применяемой командной оболочки и настроек пользователя в момент выполнения программы.

$ <b>./showenv</b>

HOSTNAME=tilde.provider.com

LOGNAME=neil

MAIL=/var/spool/mail/neil

TERM=xterm

HOSTTYPE=i386

PATH=/usr/local/bin:/bin:/usr/bin:

HOME=/usr/neil

LS_OPTIONS=-N --color=tty -T 0

SHELL=/bin/bash

OSTYPE=Linux

...

Как это работает

Для вывода всего окружения программа в цикле обращается к переменной

environ
— массиву нуль-терминированных строк.

Время и дата

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

Примечание

Во всех системах UNIX применяется одна и та же точка отсчета времени и дат: полночь по Гринвичу (GMT) на 1 января 1970 г. Это "начало эпохи UNIX", и ОС Linux — не исключение. Время в системе Linux измеряется в секундах, начиная с этого момента времени. Такой способ обработки аналогичен принятому в системе MS-DOS за исключением того, что эпоха MS-DOS началась в 1980 г. В других системах применяют точки отсчета иных эпох.

Время задается с помощью типа

time_t
. Это целочисленный тип, достаточный для хранения дат и времени в секундах. В Linux-подобных системах это тип
long integer
(длинное целое), определенный вместе с функциями, предназначенными для обработки значений времени, в заголовочном файле time.h.

Примечание

Не думайте, что для хранения времени достаточно 32 битов. В системах UNIX и Linux, использующих 32-разрядный тип

time_t
, временное значение "будет превышено" в 2038 г. Мы надеемся, что к тому времени системы перейдут на тип
time_t
, содержащий более 32 битов. Недавнее широкое внедрение 64-разрядных процессоров превращает это практически в неизбежность.

<b>#include &lt;time.h&gt;</b>

<b>time_t time(time_t *tloc);</b>

Вы можете найти низкоуровневое значение времени, вызвав функцию

time
, которая вернет количество секунд с начала эпохи (упражнение 4.6). Она также запишет возвращаемое значение по адресу памяти, на который указывает параметр
tloc
, если он — непустой указатель.

Упражнение 4. Функция
time

Далее для демонстрации функции time приведена простая программа envtime.c.

#include &lt;time.h&gt;

#include &lt;stdio.h&gt;

#include &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;

int main() {

 int i;

 time_t the_time;

 for (i = 1; i &lt;= 10; i++) {

  the_time = time((time_t *)0);

  printf(&quot;The time is %ld\n&quot;, the_time);

  sleep(2);

 }

 exit(0);

}

Когда вы запустите программу, она будет выводить низкоуровневое значение времени каждые 2 секунды в течение 20 секунд.

68
{"b":"285844","o":1}