- •Оглавление
- •Окружение Введение в окружение
- •Процессы в Linux
- •Массив environ
- •Чтение окружения: getenv()
- •Запись окружения: setenv()
- •Сырая модификация окружения: putenv()
- •Удаление переменной окружения: unsetenv()
- •Очистка окружения: clearenv()
- •Файловый ввод-вывод Обзор механизмов ввода-вывода в Linux
- •Файловые дескрипторы
- •Открытие файла: системный вызов open()
- •Закрытие файла: системный вызов close()
- •Чтение файла: системный вызов read()
- •Запись в файл: системный вызов write()
- •Произвольный доступ: системный вызов lseek()
- •Многозадачность
- •Основы многозадачности в Linux
- •Использование getpid() и getppid()
- •Порождение процесса
- •Замена образа процесса
- •Функции семейства exec()
- •Файловая система Типы файлов
- •Индексные дескрипторы и жесткие ссылки
- •Режим файла
- •Утилита make Введение
- •Мультифайловое программирование
- •Автоматическая сборка
- •Библиотеки Введение в библиотеки
- •Пример статической библиотеки
- •Пример совместно используемой библиотеки
Удаление переменной окружения: unsetenv()
Функция unsetenv(), объявленная в stdlib.h, удаляет переменную из окружения. Ниже приведен адаптированный прототип этой функции.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
int unsetenv (const char * name);
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Прежде всего, обратим внимание на то, что раньше функция unsetenv() ничего не возвращала (void). С выходом версии 2.2.2 библиотеки glibc (январь 2001 года) функция стала возвращать int.
Функция unsetenv() использует в качестве аргумента имя переменной окружения. Возвращаемое значение - нуль при удачном завершении и -1 в случае ошибки. Рассмотрим простую программу, которая удаляет переменную окружения USER (!!!). Каждый процесс работает с собственной копией окружения, никак не связанной с копиями окружения других процессов, за исключением дочерних процессов, которых у нас нет. Ниже приведен исходный код программы, учитывающий исторические изменения прототипа функции unsetenv().
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/* unsetenv.c */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gnu/libc-version.h>
#define OLD_LIBC_VERSION 0
#define NEW_LIBC_VERSION 1
#define E_VAR "USER"
int libc_cur_version (void)
{
int ret = strcmp (gnu_get_libc_version (), "2.2.2");
if (ret < 0) return OLD_LIBC_VERSION;
return NEW_LIBC_VERSION;
}
int main (void)
{
int ret;
char * str;
if (libc_cur_version () == OLD_LIBC_VERSION)
{
unsetenv (E_VAR);
} else
{
ret = unsetenv (E_VAR);
if (ret != 0)
{
fprintf (stderr, "Cannot unset '%s'\n", E_VAR);
exit (1);
}
}
str = getenv (E_VAR);
if (str == NULL)
{
printf ("'%s' has removed from environment\n", E_VAR);
} else
{
printf ("'%s' hasn't removed\n", E_VAR);
}
exit (0);
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
В программе показан один из самых «варварских» способов подстроить код под версию библиотеки. Это сделано исключительно для демонстрации двух вариантов unsetenv(). Никогда не делайте так в реальных программах. Намного проще и дешевле (в плане времени), не получая ничего от unsetenv() проверить факт удаления переменной при помощи getenv().
Очистка окружения: clearenv()
Функция clearenv(), объявленная в заголовочном файле stdlib.h, используется крайне редко для полной очистки окружения. clearenv() поддерживается не всеми версиями Unix.
Ниже приведен ее прототип.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
int clearenv (void);
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
При успешном завершении clearenv() возвращает нуль. В случае ошибки возвращается ненулевое значение.
В большинстве случаев вместо clearenv() можно использовать следующую инструкцию:
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
environ = NULL;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Лабораторные задания
В соответствии с вариантом задания разработать и отладить программу. Исходные данные вводятся с клавиатуры и записываются в переменную окружения. Программа читает эти данные, после обработки результаты помещаются в переменную «OUTPUT». Все задания компилировать с помощью утилиты MAKE.
Варианты заданий
1. Из текста удалить четвертое слово.
2. Сформировать переменную, содержащую записи по результатам сдачи очередного экзамена студентами группы. Выбрать записи для студентов, получивших отличные оценки и записать их в новую переменную.
3. В тексте добавить после третьего слова новое слово.
4. Сформировать переменную, содержащую записи по результатам сдачи очередного экзамена студентами группы. Выбрать фамилии, сдавших на отлично.
5. В тексте удалить лишние пробелы.
6. В тексте имеются произвольно расположенные русские и английские слова. Разделить текст на две части, в одной должно находиться английские слова, в другой - русские.
7. Для заданного текста определить длину содержащейся в нем максимальной серии символов, отличных от букв.
8. Сформировать переменную, содержащую заключенные в круглые скобки последовательности символов исходного текста.
9. Имеется текст со сведениями о сотрудниках предприятия, содержащими год рождения. Выбрать и записать в файл записи для сотрудников младше заданного возраста.
10. Из переменной, содержащей сведения о студентах сформировать переменную, в которую входят только фамилии.
11. Из текста выбрать четные слова.
12. В тексте поменять местами первое и последнее слова.
13. Из текста удалить все нечетные слова.
14. Выбрать из текста слова стоящие на позициях, которые соответствуют ряду простых чисел.
15. Из текста удалить каждое третье слово.
16. В тексте заменить все пробелы на символ «&».
17. Создать переменную записать в нее два слова, первое слово состоит из первых букв слов исходного текста, второе – из последних.
18. Подсчитать количество каждой буквы русского алфавита, встречающиеся в исходном тексте.
19. Все гласные буквы в исходном тексте, заменить на восклицательный знак.
20. Удалить каждую вторую букву каждого второго слова исходного текста.