Нейл Мэтью - Основы программирования в Linux стр 52.

Шрифт
Фон

Упражнение 4.4. Функции getenv и putenv

1. Первые несколько строк после объявления функции main гарантируют корректный вызов программы environ.c с только одним или двумя аргументами:

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

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

char *var, *value;

if (argc == 1 || argc > 3) {

fprintf(stderr, "usage: environ var [value]\n");

exit(1);

}

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

var = argv[1];

value = getenv(var);

if (value)

printf("Variable %s has value %s\n", var, value);

else

printf("Variable %s has no value\n", var);

3. Далее проверьте, был ли при вызове программы указан второй параметр. Если был, вы задаете значение этого аргумента, конструируя строку вида имя=значение и затем вызывая функцию putenv:

if (argc == 3) {

char *string;

value = argv[2];

string = malloc(strlen(var)+strlen(value)+2);

if (!string} {

fprintf(stderr, "out of memory\n");

exit(1);

}

strcpy(string, var);

strcat(string, "=");

strcat(string, value);

printf("Calling putenv with: %s\n", string);

if (putenv(string) != 0) {

fprintf(stderr, "putenv failed\n");

free(string);

exit(1);

}

4. В заключение вы узнаете новое значение переменной, вызвав функцию getenv еще раз:

value = getenv(var);

if (value)

printf("New value of %s is %s\n", var, value);

else

printf("New value of %s is null??\n", var);

}

exit(0);

}

Когда вы выполните эту программу, то сможете увидеть и задать переменные окружения:

$ ./environ НОМЕ

Variable HOME has value /home/neil

$ ./environ FRED

Variable FRED has no value

$ ./environ FRED hello

Variable FRED has no value

Calling putenv with: FRED=hello

New value of FRED is hello

$ ./environ FRED

Variable FRED has no value

Обратите внимание на то, что окружение локально по отношению к программе. Изменения, которые вы делаете в программе, не отражаются вне ее, поскольку значения переменных не передаются из дочернего процесса (вашей программы) в родительский (командную оболочку).

Применение переменных окружения

Программы часто применяют переменные окружения для изменения способа своей работы. Пользователи могут задать значения этих переменных окружения либо в их стандартном окружении с помощью файла .profile, читаемого их регистрационной командной оболочкой, использующей специальный файл запуска (rc) оболочки, либо заданием переменных в командной строке командной оболочки. Например,

$ ./environ FRED

Variable FRED has no value

$ FRED=hello ./environ FRED

Variable FRED has value hello

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

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

$ CDDB=mycds; export CDDB

$ cdapp

или

$ CDDB=mycds cdapp

Примечание

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

Переменная environ

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

#include <stdlib.h>

extern char **environ;

Выполните упражнение 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, то получите нечто, похожее на следующий вывод, который немного сокращен. Количество, порядок отображения и значения этих переменных зависят от версии операционной системы, применяемой командной оболочки и настроек пользователя в момент выполнения программы.

$ ./showenv

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.

Примечание

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Похожие книги