Отправляет email-рассылки с помощью сервиса Sendsay

Программирование и др.

  Все выпуски  

Программирование в Linux с нуля - Выпуск XIII


Информационный Канал Subscribe.Ru

Рассылка проекта Lindevel.Ru

Программирование в Linux с нуля. Выпуск XIII

1. Предисловие

Здравствуйте, уважаемые подписчики! Этот выпуск рассылки научит вас использовать окружение в своих программах.

С момента последнего выпуска рассылки сайт Lindevel.Ru (http://lindevel.ru) сменил систему управления контентом с MOS 4.5.2 на e107. Сайт получил новое оформление, новые возможности и избавился от былых ошибок. Единственным недостатком перехода на другую CMS стала ликвидация всех пользовательских аккаунтов, зарегистрироованных до 15.09.2005, однако в течение двух месяцев на сайте будет действовать ускоренная система регистрации новых пользователей (без подтверждения по e-mail).

Все вопросы, касающиеся рассылки или программирования в Linux задавайте в форуме на Lindevel.Ru (http://lindevel.ru).

2. Программа

2.1. Описание

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

myenv.c
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char** argv)
{
 if (argc != 3) {
  fprintf (stderr, ("Usage: myenv <variable> <value>\n"));
  exit (1);
 }

 if (getenv (argv[1]) != NULL)
 {
  printf ("%s is already exist\n", argv[1]);
  printf ("Old value: %s\n", getenv (argv[1]));
 }
 else {
  printf ("%s: not defined\n", argv[1]);
 }

 if (!setenv (argv[1], argv[2], 1))
 {
  printf ("New value: %s\n", getenv (argv[1]));
 }
 else {
  fprintf (stderr, "Fatal error occured\n");
  exit (1);
 } 

 exit (0);
}


3. Теория

3.1. Основные функции работы с окружением

Любой запущенный процесс в Linux обладает своим программным окружением. Чаще всего это независимая копия окружения родительского процесса. Для чтения или изменения переменных окружения в программах чаще всего используются функции getenv() и setenv(). Ниже представлены адаптированные прототипы этих функций:

char* getenv (const char* var);
int setenv (const char* var, const char* val, int order);

Функция getenv() возвращает значение переменной окружения var. Если getenv() возвращает NULL, значит переменная отсутствует в окружении.

Функция setenv() устанавливает значение для переменной окружения. Если переменная отсутствует в окружении, то будет создана. Аргумент var - имя переменной, аргумент val - вносимое значение. Если аргумент order не равен нулю, то существующая переменная перезаписывается, если order равен нулю и переменная существует в окружении, то ничего не происходит. В случае успешного завершения setenv() возвращает нулевое значение.

3.2. Другие функции работы с окружением

В Linux есть еще несколько функций для работы с окружением: это putenv(), unsetenv() и clearenv(). Эти функции используются редко, но их надо знать в лицо.

putenv() в принципе делает то же, что и setenv(), только другим способом (ее единственный аргумент - это строка в формате ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ). Я настоятельно рекомендую вам не использовать эту функцию в своих программах, поскольку она доступна не во всех Unix-системах.

Функция unsetenv() удаляет переменную из окружения. Ее единственный аргумент - это имя переменной.

Функция clearenv() вызывается без аргументов. Она очищает все окружение, однако доступна не во всех Unix-системах.

3.3. Использование таблицы окружения

Рассмотренные выше функции представляют собой безопасный способ работы с окружением. Однако программа может получить доступ к окружению через глобальный двумерный массив строк environ. Глобальное объявление

extern char** environ;
позволит вам читать окружение удобным для вас способом, однако я не рекомендую изменять environ методом непосредственной записи. Функция setenv() делает это правильно и безопасно. Однако инструкция
environ = NULL;
вполне безопасна и позволяет очистить все окружение, не заботясь о переносимости.

Массив environ часто называют таблицей окружения или просто окружением.

3.3. Окружение и функции exec()

Изучая основы многозадачности Linux мы обошли стороной изучение функций execXe(). Эти функции (execve() и execle()) запускают программу с модифицированным окружением. Последний аргумент каждой из этих функций - это окружение (массив environ) запускаемой программы.

4. Разбор полетов

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

$ ./myenv MYVAR myvar-value
MYVAR: not defined
New value: myvar-value
$ echo $MYVAR
$

Этот выпуск завершает изучение темы "Программное окружение". Теперь будем изучать файлы. Полный архив рассылки доступен на сайте Lindevel.Ru (http://lindevel.ru).

До новых встреч.
Николай.
mailto: nnivanov@mail.ru

Новости сайта Lindevel.Ru

  • На сайте открыт Интернет-магазин, в котором вы можете приобрести по доступным ценам все, что нужно для программирования в Linux (дистрибутивы, книги и проч.)
  • В течение недели сайт существенно пополнится учебными материалами.

Рассылки Subscribe.Ru
*nix project - новости из мира unix-систем! (ежедневная)

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.linuxp
Отписаться
Вспомнить пароль

В избранное