Применяя операцию PB_SET_DUMPABLE в характерном для Linux системном вызове prctl(), мы можем установить для процесса флаг dumpable. Таким образом, когда программа с установленным ID пользователя (группы) запускается пользователем, не являющимся ее владельцем (из группы владельца), может быть создан дамп ядра. Операция PB_SET_DUMPABLE доступна в Linux, начиная с версии 2.4. Для получения дополнительной информации см. страницу справочника prctl(2). Кроме того, начиная с версии ядра 2.6.13, файл /proc/sys/fs/suid_dumpable предоставляет контроль уровня системы за тем, создают ли процессы, запущенные с установленным ID пользователя (группы) файлы дампа ядра. Для получения дополнительной информации см. страницу справочника prctl(5).

Начиная с версии 2.6.23 характерный для Linux файл /proc/PID/coredump_filter может для каждого процесса определить, какого рода отображения памяти записываются в файл дампа ядра. (Виды отображений памяти будут рассмотрены в главе 45.) Значение, содержащееся в этом файле — это маска, состоящая из четырех битов, соответствующих четырем типам отображений памяти: приватные анонимные отображения, приватные отображения файлов, анонимные отображения с общим доступом и отображения файлов с общим доступом. Значение файла по умолчанию представляет собой традиционное поведение Linux: создается дамп только частных анонимных отображений и анонимных отображений с общим доступом. Для получения дополнительной информации см. страницу справочника core(5).

Имена файлов дампа ядра: /proc/sys/kernel/core_pattern

Начиная с Linux 2.6, строка формата, содержащаяся в характерном для Linux файле /proc/sys/kernel/core_pattern, контролирует присвоение имен всем файлам дампа ядра, создаваемым в системе. По умолчанию этот файл содержит строку core. Привилегированный пользователь может настроить процесс присвоения имен так, чтобы имя файлов дампа содержало любой из перечисленных в табл. 22.1 спецификаторов формата. Они заменяются значением, приведенным в правом столбце таблицы. Кроме того, строка может содержать косые черты (/). Иными словами, можно контролировать не только имя файла дампа, но также и каталог (абсолютный и относительный), в котором файл создается. После замены всех спецификаторов формата получившаяся строка путевого имени уменьшается до 128 символов максимально (или 64 в версиях Linux до 2.6.19).

Начиная с версии ядра 2.6.19, Linux поддерживает дополнительный синтаксис в файле core_pattern. Если этот файл содержит строку, начинающуюся с символа конвейера (|), значит, все последующие символы файла воспринимаются как программа с необязательными аргументами (которые могут также включать классификаторы с символом %, перечисленные в табл. 22.1). Эта команда будет выполнена при создании файла дампа ядра. Дамп ядра записывается в стандартный ввод программы, а не в файл. Для получения дополнительной информации см. страницу справочника core(5).

Некоторые другие реализации UNIX предоставляют средства, аналогичные core_pattern. Например, в системах, производных от BSD, имя программы приставляется к имени файла, например core.progname. В Solaris предоставляется специальный инструмент (coreadm), который позволяет пользователю выбрать имя файла и каталог, в который будет сохранен файл дампа ядра.

Таблица 22.1. Спецификаторы формата для /proc/sys/kernel/core_pattern

Спецификатор — Заменяется на

%c — Мягкое ресурсное ограничение размера файла дампа (в байтах, начиная с Linux 2.6.24)

%e — Имя исполняемого файла (без путевого префикса)

%g — Реальный групповой идентификатор процесса завершенного с дампом

%h — Имя хоста системы

%p — Идентификатор процесса, завершенного с дампом

%s — Номер сигнала, завершившего процесс

%t — Время создания дампа, в секундах с начала отсчета

%u — Реальный ID пользователя процесса, завершенного с дампом

%% — Единичный символ %

22.2. Частные случаи доставки, диспозиции и обработки

Для некоторых сигналов применяются особые правила доставки, задания диспозиции и обработки, как описано в этом разделе.

SIGKILL и SIGSTOP

Невозможно изменить действие по умолчанию сигнала SIGKILL, который всегда завершает процесс и SIGSTOP, который всегда останавливает процесс. Обе функции, signal() и sigaction(), возвращают ошибку при попытке изменить диспозицию этих сигналов. Эти сигналы не могут быть заблокированы, что характерно именно для них. Запрет изменения действий этих сигналов по умолчанию означает, что они всегда могут быть использованы для завершения или остановки процесса, над которым был потерян контроль.

SIGCONT и стоп-сигналы

Как уже отмечалось ранее, сигнал SIGCONT используется для возобновления процесса, ранее остановленного одним из стоп-сигналов (SIGSTOP, SIGTSTP, SIGTTIN и SIGTTOU). Из-за уникального предназначения в некоторых ситуациях ядро обрабатывает эти сигналы отлично от других.

Перейти на страницу:

Похожие книги