Вход/Регистрация
Операционная система UNIX
вернуться

Робачевский Андрей Михайлович

Шрифт:

#include <sys/time.h>

#include <sys/resource.h>

int getrlimit{int resource, struct rlimit *rlp);

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

Аргумент

resource
определяет вид ресурса, для которого мы хотим узнать или изменить ограничения процесса. Структура
rlimit
состоит из двух полей:

rlim_t rlim_cur;

rlim_t rlim_max;

определяющих, соответственно, изменяемое (soft) и жесткое (hard) ограничение. Первое определяет текущее ограничение процесса на данный ресурс, а второе — максимальный возможный предел потребления ресурса. Например, изменяемое ограничение на число открытых процессом файлов может составлять 64, в то время как жесткое ограничение равно 1024.

Любой процесс может изменить значение текущего ограничения вплоть до максимально возможного предела. Жесткое ограничение может быть изменено в сторону увеличения предела потребления ресурса только процессом с привилегиями суперпользователя. Обычные процессы могут только уменьшить значение жесткого ограничения. Обычно ограничения устанавливаются при инициализации системы и затем наследуются порожденными процессами (хотя в дальнейшем могут быть изменены).

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

rlim_max
равным
RLIM_INFINITY
. В этом случае физические ограничения системы (например, объем памяти и дискового пространства) будут определять реальный предел использования того или иного ресурса.

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

Таблица 2.21. Ограничения процесса (значения аргумента resource)

Ограничение Тип ресурса Эффект
RLIMIT_CORE
Максимальный размер создаваемого файла core, содержащего образ памяти процесса. Если предел установлен равным 0, файл core создаваться не будет. После создания файла core запись в этот файл будет остановлена при достижении предельного размера.
RLIMIT_CPU
Максимальное время использования процессора в секундах. При превышении предела процессу отправляется сигнал
SIGXCPU
.
RLIMIT_DATA
Максимальный размер сегмента данных процесса в байтах, т.е. максимальное значение смещения брейк-адреса. При достижении этого предела последующие вызовы функции brk(2) завершатся с ошибкой
ENOMEM
.
RLIMIT_FSIZE
Максимальный размер файла, который может создать процесс. Если значение этого предела равно 0, процесс не может создавать файлы. При достижении этого предела процессу отправляется сигнал
SIGXFSZ
. Если сигнал перехватывается или игнорируется процессом, последующие попытки увеличить размер файла закончатся с ошибкой
EFBIG
.
RLIMIT_NOFILE
Максимальное количество назначенных файловых дескрипторов процесса. При достижении этого предела, последующие попытки получить новый файловый дескриптор закончатся с ошибкой
EMFlLE
.
RLIMIT_STACK
Максимальный размер стека процесса. При попытке расширить стек за установленный предел отправляется сигнал
SIGSEGV
. Если процесс перехватывает или игнорирует сигнал и не использует альтернативный стек с помощью функции sigaltstack(2), диспозиция сигнала устанавливается на действие по умолчанию перед отправкой процессу.
RLIMIT_VMEM
Максимальный размер отображаемой памяти процесса в байтах. (Предел определен в версиях System V.) При достижении этого предела последующие вызовы brk(2) или mmap(2) завершатся с ошибкой
ENOMEM
.
RLIMIT_NPROC
Максимальное число процессов с одним реальным UID. Определяет максимальное число процессов, которые может запустить пользователь. (Предел определен в версиях BSD UNIX.) При достижении этого предела, последующие вызовы fork(2) для порождения нового процесса завершатся с ошибкой
EAGAIN
.
RLIMIT_RSS
Максимальный размер в байтах резидентной части процесса (RSS — Resident Set Size). Определяет максимальное количество физической памяти, предоставляемой процессу. (Предел определен в версиях BSD UNIX.) Если система ощущает недостаток памяти, ядро освободит память за счет процессов, превысивших свой RSS.
RLIMIT_MEMLOCK
Максимальный физической памяти (физических страниц) в байтах, который процесс может заблокировать с помощью системного вызова mlock(2). (Предел определен в версиях BSD UNIX.) При превышении предела системный вызов mlock(2) завершится с ошибкой
EAGAIN
.

В заключение приведем пример программы, выводящий на экран установленные ограничения для процесса:

#include <sys/types.h>

#include <sys/resource.h>

/* Процедура вывода на экран текущего и максимального

пределов потребления ресурса resource */

void disp_limit(int resource, char *rname) {

 struct rlimit rim;

 getrlimit(resource, &rlm);

 printf("%-13s ", rname);

 /* Значение изменяемого ограничения */

 if (rlm.rlim_curr == RLIM_INFINITY)

printf("infinite ");

 else

printf("%101d ", rlm.rlim_cur);

 /* Значение жесткого ограничения */

 if (rlm.rlim_max == RLIM_INFINITY)

printf("infinite \n");

 else

printf("%10ld\n", rlm.rlim_max);

}

main {

 disp_limit(RLIMIT_CORE, "RLIMIT_CORE");

 disp_limit(RLIMIT_CPU, "RLIMIT_CPU");

 disp_limit(RLIMIT_DATA, "RLIMIT_DATA");

 disp_limit(RLIMIT_FSIZE, "RLIMIT_FSIZE");

 disp_limit(RLIMIT_NOFILE, "RLIMIT_NOFILE");

 disp_limit(RLIMIT_STACK, "RLIMIT_STACK");

 /* BSD */

#ifdef RLIMIT_NPROC

 disp_limit(RLIMIT_NPROC, "RLIMIT_NPROC");

#endif

 /* BSD */

#ifdef RLIMIT_RSS

 disp_limit(RLIMIT_RSS, "RLIMIT_RSS");

#endif

 /* BSD */

#ifdef RLIMIT_MEMLOCK

 disp_limit(RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");

#endif

 /* System V */

#ifdef RLIMIT_VMEM

  • Читать дальше
  • 1
  • ...
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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