Вход/Регистрация
Разработка приложений в среде 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
, определенную следующим образом:

struct rlimit {

 long int rlim_cur; /* мягкое ограничение */

 long int rlim_max; /* жесткое ограничение */

};

Второй член структуры —

rlim_max
, указывает жесткое ограничение лимита, переданного в параметре
resource
, a
rlim_cur
— мягкое ограничение. Это те же наборы лимитов, которыми манипулируют команды
ulimit
и
limit
, одна из которых встроена в большинство командных оболочек.

10.4. Примитивы процессов

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

10.4.1. Создание дочерних процессов

В Linux предусмотрены два системных вызова, которые создают новые процессы:

fork
и
clone
. Как упоминалось ранее,
clone
используется для создания потоков, и этот вызов будет кратко описан далее. А сейчас мы сосредоточимся на
fork
— наиболее популярном методе создания процессов.

#include <unistd.h>

pid_t fork(void);

Этот системный вызов имеет уникальное свойство возвращать управление не один раз, а дважды: один раз в родительском процессе и другой — в дочернем. Обратите внимание, что мы не говорим "первый — в родительском" — написание кода, который делает какие-то предположения относительно предопределенного порядка — очень плохая идея.

Каждый из двух возвратов системного вызова

fork
имеет разные значения. В родительский процесс этот системный вызов возвращает pid вновь созданного дочернего процесса, а в дочернем он возвращает 0.

Разница возвращаемых значений — это единственное отличие, видимое процессам. Оба имеют одинаковые образы памяти, права доступа, открытые файлы и обработчики сигналов [19] . Рассмотрим простой пример программы, порождающей дочерний процесс.

#include <sys/types.h>

#include <stdio.h>

#include <unistd.h>

int main(void) {

 pid_t child;

19

Детальную информацию о том, как родительские и дочерние открытые файлы соотносятся друг с другом, можно найти в главе 11.

 if (!(child = fork)) {

printf("в дочернем\n");

exit (0);

 }

 printf("в родительском - дочерний: %d\n", child);

 return 0;

}

10.4.2. Наблюдение за уничтожением дочерних процессов

Сбор состояний возврата дочернего процесса называется ожиданием процесса. Это можно делать четырьмя способами, хотя только один из вызовов предоставляется ядром. Остальные три метода реализованы в стандартной библиотеке С. Поскольку системный вызов ядра принимает четыре аргумента, он называется

wait4
.

pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);

Первый аргумент,

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

pid < -1
Ожидать завершения любого дочернего процесса, чей pgid равен абсолютному значению
pid
.

pid = -1
Ожидать прерывания любого дочернего процесса.

pid = 0
Ожидать завершения дочернего из той же группы процессов, что и текущий [20]
.

20

Группы процессов рассматриваются далее в этой главе

  • Читать дальше
  • 1
  • ...
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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