Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

% EDITOR=emacs

% export EDITOR

Или короче:

% export EDITOR=emacs

В программе доступ к переменным среды осуществляет функция

getenv
, объявленная в файле
<stdlib.h>
. В качестве аргумента она принимает имя переменной и возвращает се значение в строковом виде или
NULL
, если переменная не определена в данной среде. Для установки и сброса значений переменных среды предназначены функции
setenv
и
unsetenv
соответственно.

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

environ
, определенной в GNU-библиотеке языка С. Данная переменная имеет тип
char**
и представляет собой массив указателей на символьные строки, последним элементом которого является
NULL
. Каждая строка имеет вид
ПЕРЕМЕННАЯ=значение
.

Программа, представленная в листинге 2.3, отображает всю свою среду, просматривая в цикле массив

environ
.

Листинг 2.3. (print-env.c) Вывод переменных среды

#include <stdio.h>

/* Массив ENVIRON содержит среду выполнения. */

extern char** environ;

int main {

 char** var;

 for (var = environ; *var != NULL; ++var)

printf("%s\n", *var);

 return 0;

}

He пытайтесь модифицировать массив

environ
самостоятельно. Пользуйтесь для этих целей функциями
setenv
и
unsetenv
.

Обычно при запуске программа получает копию среды своей родительской программы (интерпретатора команд, если она была запущена пользователем). Таким образом, программы, запущенные из командной строки, могут исследовать среду интерпретатора команд.

Переменные среды чаще всего используют для передачи программам конфигурационной информации. Предположим, к примеру, что требуется написать программу, подключающуюся к серверу Internet. Имя сервера может задаваться в командной строке, но, если оно меняется нечасто, имеет смысл определить специальную переменную среды — скажем,

SERVER_NAME
, — которая будет хранить имя сервера. При отсутствии переменной программа берет имя, заданное по умолчанию. Интересующая нас часть программы показана в листинге 2.4.

Листинг 2.4. (client.с) Часть сетевой клиентской программы

#include <stdio.h>

#include <stdlib.h>

int main {

 char* server_name = getenv("SERVER_NAME");

 if (server_name == NULL)

/* переменная среды SERVER_NAME не задана. Используем

установки по умолчанию. */

server_name = "server.my-company.com";

 printf("accessing server %s\n", server_name);

 /* Здесь осуществляется доступ к серверу... */

 return 0;

}

Допустим, программа называется

client
. Если переменная
SERVER_NAME
не задана, используется имя сервера, заданное по умолчанию:

% client

accessing server server.my-company.com

Вот как задается другой сервер:

% export SERVER_NAME=backup-server.elsewhere.net

% client

accessing server backup-server.elsewhere.net

2.1.7. Временные файлы

Иногда программе требуется создать временный файл, например для промежуточного хранения большого объема данных или для передачи данных другой программе. В системах GNU/Linux временные файлы хранятся в каталоге

/tmp
. Работая с временными файлами, необходимо помнить о следующих ловушках.

■ Одновременно может быть запущено несколько экземпляров программы (одним и тем же пользователем или разными пользователями). Все они должны использовать разные имена временных файлов, чтобы не было конфликтов.

■ Права доступа к временным файлам должны задаваться таким образом, чтобы неавторизованные пользователи не могли влиять на работу программы путем модификации или замены временного файла.

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

В Linux имеются функции

mkstemp
и
tmpfile
, решающие все вышеперечисленные проблемы. Выбор между ними делается на основании того, должен ли временный файл передаваться другой программе и какие функции ввода-вывода будут применяться при работе с файлом: низкоуровневые (
read
,
write
и т.д.) или потоковые (
fopen
,
fprintf
и т.д.).

  • Читать дальше
  • 1
  • ...
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: