Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

int putenv(const char * string);

Переданный функции параметр

string
должен иметь форму
ИМЯ=ЗНАЧЕНИЕ
.
putenv
добавляет переменную по имени
ИМЯ
к текущему окружению и присваивает ей значение
ЗНАЧЕНИЕ
. Если окружение уже содержит переменную
ИМЯ
, ее значение изменяется на
ЗНАЧЕНИЕ
.

BSD определяет функцию

setenv
, которую Linux также поддерживает. Это более гибкий и удобный способ добавления переменных к окружению.

int setenv(const char * name, const char * value, int overwrite);

Здесь имя и новое значение переменной окружения передаются

раздельно, что обычно программам делать проще. Если
overwrite
равно 0, окружение не модифицируется, если оно уже содержит переменную по имени
name
. В противном случае значение переменной модифицируется, как и в
putenv
.

Ниже приведен короткий пример использования обеих функций. Оба вызова делают одно и то же, заменяя переменную окружения

PATH
для запущенной программы.

putenv("PATH=/bin:/usr/bin");

setenv("PATH","/bin:/usr/bin", 1);

10.3.2 Использование ресурсов

Ядро Linux отслеживает, сколько ресурсов использует каждый процесс. Хотя отслеживается только небольшое их число, их измерения могут быть полезными разработчикам, администраторам и пользователям. В табл. 10.1 перечислены ресурсы, использование которых отслеживается ядром Linux версии 2.6.7.

Таблица 10.1. Ресурсы процессов, отслеживаемые Linux

Тип Член Описание
struct timeval
ru_utime
Общее время, затраченное на выполнение кода в режиме пользователя. Это включает в себя все время, потраченное на выполнение инструкций приложения, но исключая время, потраченное ядром на обслуживание запросов приложения.
struct timeval
ru_stime
Общее время, потраченное ядром на выполнение запросов процесса. Это не включает времени блокировки процесса в период ожидания выполнения системных вызовов.
long
ru_minflt
Количество второстепенных сбоев (minor faults), вызванных данным процессом. Второстепенные сбои — это попытки доступа к памяти, переключающие процессор в режим ядра, но не вызывающих обращений к диску. Это случается, когда процесс пытается писать за пределами стека, что вынуждает ядро распределить больше пространства стека, прежде чем продолжить выполнение процесса.
long
ru_majflt
Количество первостепенных сбоев (major faults), вызванных данным процессом. Первостепенные сбои — это обращения к памяти, заставляющие ядро обратиться к диску, прежде чем программа сможет продолжить работу. Одной из частых причин этого может быть обращение к части исполняемой памяти, которая еще не была загружена в ОЗУ с диска либо была временно выгружена на диск.
long
ru_nswap
Количество страниц памяти, для которых был выполнен обмен с диском при обращении к памяти из процесса.

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

Системный вызов

getrusage
возвращает структуру
struct rusage
(определенную в
<sys/resource.h>
), содержащую информацию о текущем использовании ресурсов.

int getrusage(int who, struct rusage * usage);

Первый параметр,

who
, сообщает, какой из трех счетчиков ресурсов должен быть возвращен.
RUSAGE_SELF
возвращает использование ресурсов текущим процессом,
RUSAGE_CHILDREN
— его дочерними процессами, a
RUSAGE_BOTH
— общее использование ресурсов текущим процессом и всеми его дочерними процессами. Второй параметр
getrusage
— это указатель на
struct rusage
, куда помещается информация об использовании ресурсов. Хотя struct rusage и содержит относительно немного членов (список унаследован из BSD), большинство этих членов пока не используются Linux). Ниже представлено полное определение этой структуры. В табл. 10.1 описаны члены, используемые в настоящее время Linux.

#include <sys/resource.h>

struct rusage {

 struct timeval ru_utime;

 struct timeval ru_stime;

 long intru_maxrss;

 long intru_ixrss;

 long intru_idrss;

 long intru_isrss;

 long intru_minflt;

 long intru_majfit;

 long intru_nswap;

 long intru_inblock;

 long intru_oublock;

 long intru_msgsnd;

 long intru_msgrcv;

 long intru_nsignals;

 long intru_nvcsw;

 long intru_nivcsw;

};

10.3.3. Применение ограничений использования ресурсов

Чтобы помочь в предотвращении неконтролируемого снижения производительности процессами, Unix отслеживает многие ресурсы, которые может использовать процесс, и позволяет системному администратору и самим пользователям накладывать ограничения на расход ресурсов процессами.

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

RLIM_INFINITY
, что означает отсутствие каких-либо ограничений. Единственное исключение из этого —
RLIMIT_CORE
(максимальный размер дампа памяти), который Linux инициирует нулем, чтобы предотвратить неожиданный сброс дампов ядра. Многие дистрибутивы сбрасывают этот лимит при запуске, однако, большинство технических пользователей ожидают появления дампов памяти при некоторых условиях (информацию о дампах памяти можно найти далее в главе). Мягкие ограничения — это те ограничения, которые установлены в ядре в данный момент. Любой процесс может наложить мягкое ограничение на использование ресурса на определенном уровне — равном или более низком, чем установленное жесткое ограничение.

Таблица 10.2. Ограничения ресурсов

Значение Лимит
RLIMIT_AS
Максимальный объем памяти, доступный процессу. Включает память для стека, глобальных переменных и динамически выделенную память.
RLIMIT_CORE
Максимальный размер дампа памяти, генерируемого ядром (если файл дампа получается слишком большим, он не создается).
RLIMIT_CPU
Общее используемое время процессора (в секундах). Более подробно об этом ограничении рассказывается при описании
SIGXCPU
в главе 12.
RLIMIT_DATA
Максимальный объем памяти данных (в байтах). Это не включает динамически выделенную память.
RLIMIT_FSIZE
Максимальный размер открытого файла (проверяется при записи). Более подробно об этом ограничении рассказывается при описании
SIGXFSZ
в главе 12.
RLIMIT_MEMLOCK
Максимальный объем памяти, которая может быть блокирована с помощью
mlock
. Функция
mlock
рассматривается в главе 13.
RLIMIT_NOFILE
Максимальное количество открытых файлов.
RLIMIT_NPROC
Максимальное количество дочерних процессов, которые может породить данный процесс. Это ограничивает только количество дочерних процессов, которые могут существовать одновременно. Это не ограничивает количества наследников дочерних процессов — каждый из них может иметь до
RLIMIT_NPROC
потомков.
RLIMIT_RSS
Максимальный объем ОЗУ, использованный в любой момент (всякое превышение этого объема используемой памяти вызывает страничную подкачку). Это также известно под названием размера резидентной части (resident set size).
RLIMIT_STACK
Максимальный размер памяти стека (в байтах), включая все локальные переменные.

Различные ограничения, которые могут быть установлены, перечислены в табл. 10.2 и определены в

<sys/resource.h>
. Системные вызовы
getrlimit
и
setrlimit
устанавливают и получают ограничения для отдельного ресурса.

int getrlimit(int resource, struct rlimit *rlim);

int setrlimit(int resource, const struct rlimit *rlim);

Обе эти функции используют структуру

struct rlimit
, определенную следующим образом:

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

Темный Патриарх Светлого Рода 6

Лисицин Евгений
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6

Полководец поневоле

Распопов Дмитрий Викторович
3. Фараон
Фантастика:
попаданцы
5.00
рейтинг книги
Полководец поневоле

"Колхоз: Назад в СССР". Компиляция. Книги 1-9

Барчук Павел
Колхоз!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Колхоз: Назад в СССР. Компиляция. Книги 1-9

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Измена. Ребёнок от бывшего мужа

Стар Дана
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Ребёнок от бывшего мужа

Отмороженный 3.0

Гарцевич Евгений Александрович
3. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 3.0

Мимик!

Северный Лис
1. Сбой Системы!
Фантастика:
боевая фантастика
5.40
рейтинг книги
Мимик!

Целитель. Книга вторая

Первухин Андрей Евгеньевич
2. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель. Книга вторая

(Бес) Предел

Юнина Наталья
Любовные романы:
современные любовные романы
6.75
рейтинг книги
(Бес) Предел

Гром над Империей. Часть 2

Машуков Тимур
6. Гром над миром
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Гром над Империей. Часть 2

Дикая фиалка Юга

Шах Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Дикая фиалка Юга

Физрук 2: назад в СССР

Гуров Валерий Александрович
2. Физрук
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Физрук 2: назад в СССР

Возвращение

Жгулёв Пётр Николаевич
5. Real-Rpg
Фантастика:
боевая фантастика
рпг
альтернативная история
6.80
рейтинг книги
Возвращение

Релокант

Ascold Flow
1. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант