Операционная система UNIX - страница 80
>. В этом случае физические ограничения системы (например, объем памяти и дискового пространства) будут определять реальный предел использования того или иного ресурса.
Различные ограничения и связанные с ними типы ресурсов приведены в табл. 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
>#include
>/* Процедура вывода на экран текущего и максимального
> пределов потребления ресурса 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
> disp_limit(RLIMIT_VMEM, "RLIMIT_VMEM");