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

Мэтью Нейл

Шрифт:

Определенный выше тип

rlim_t
— целочисленный тип, применяемый для описания уровней ресурсов. Обычно мягкое ограничение — это рекомендуемое ограничение, которое не следует превышать; нарушение этой рекомендации может вызвать возврат ошибок из библиотечных функций. При превышении жесткого ограничения система может попытаться завершить программу, отправив ей сигнал, например, сигнал
SIGXCPU
при превышении ограничения на потребляемое время ЦП и сигнал
SIGSEGV
при превышении ограничения на объем данных. В программе можно самостоятельно задать для любых значений собственные мягкие ограничения, не превышающие жесткого ограничения. Допустимо уменьшение жесткого ограничения. Увеличить его может только программа, выполняющаяся с правами суперпользователя.

Ограничить можно ряд системных ресурсов. Эти ограничения описаны в параметре

resource
функций
rlimit
и определены в файле sys/resource.h, как показано в табл. 4.13.

Таблица 4.13

Параметр
resource
Описание
RLIMIT_CORE
Ограничение размера файла дампа ядра, в байтах
RLIMIT_CPU
Ограничение времени ЦП, в секундах
RLIMIT_DATA
Ограничение размера сегмента
data
, в байтах
RLIMIT_FSIZE
Ограничение размера файла, в байтах
RLIMIT_NOFILE
Ограничение количества открытых файлов
RLIMIT_STACK
Ограничение размера стека, в байтах
RLIMIT_AS
Ограничение доступного адресного пространства (стек и данные), в байтах

В упражнении 4.15 показана программа limits.c, имитирующая типичное приложение. Она также задает и нарушает ограничения ресурсов.

Упражнение 4.16. Ограничения ресурсов

1. Включите заголовочные файлы для всех функций, которые вы собираетесь применять в данной программе:

#include <sys/types.h> \

#include <sys/resource.h>

#include <sys/time.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

2. Функция типа

void
записывает 10 000 раз строку во временный файл и затем выполняет некоторые арифметические вычисления для загрузки ЦП:

void work {

 FILE *f;

 int i;

 double x = 4.5;

 f = tmpfile;

 for (i = 0; i < 10000; i++) {

fprintf(f, "Do some output\n");

if (ferror(f)) {

fprintf(stderr, "Error writing to temporary file\n");

exit(1);

}

 }

 for (i = 0; i < 1000000; i++) x = log(x*x + 3.21);

}

3. Функция

main
вызывает функцию
work
, а затем применяет функцию getrusage для определения времени ЦП, использованного
work
. Эта информация выводится на экран:

int main {

 struct rusage r_usage;

 struct rlimit r_limit;

 int priority;

 work;

 getrusage(RUSAGE_SELF, &r_usage);

 printf("CPU usage: User = %ld.%06ld, System = %ld.%06ld\n",

r_usage.ru_utime.tvsec, rusage.ru_utime.tv_usec,

r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);

4. Далее она вызывает функции

getpriority
и
getrlimit
для выяснения текущего приоритета и ограничений на размер файла соответственно:

 priority = getpriority(PRIO_PROCESS, getpid);

 printf("Current priority = %d\n", priority);

 getrlimit(RLIMIT_FSIZE, &r_limit);

 printf("Current FSIZE limit: soft = %ld, hard = %ld\n",

r_limi t.rlim_cur, r_limit.rlim_max);

5. В заключение задайте ограничение размера файла с помощью функции

setrlimit
и снова вызовите функцию
work
, которая завершится с ошибкой, т.к. попытается создать слишком большой файл:

 r_limit.rlim_cur = 2048;

 r_limit.rlim_max = 4096;

 printf("Setting a 2K file size limit\n");

 setrlimit(RLIMIT_FS1ZE, &r_limit);

 work;

 exit(0);

}

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

  • Читать дальше
  • 1
  • ...
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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