Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные_ работы_Linux.doc
Скачиваний:
7
Добавлен:
22.04.2019
Размер:
619.52 Кб
Скачать

Удаление переменной окружения: 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. Удалить каждую вторую букву каждого второго слова исходного текста.