ИМЯ
prctl -
операции
над
процессом
ОБЗОР
#include <sys/prctl.h>
int prctl(int option, unsigned long arg2, unsigned long arg3,
unsigned long arg4, unsigned long arg5);
ОПИСАНИЕ
Первый
аргумент
prctl() задаёт
тип
операции
(типы
определены
в <linux/prctl.h>,
значения
остальных
аргументов
зависят от
указываемого
типа.
Первый
аргумент
может
принимать
следующие
значения:
- PR_CAP_AMBIENT
(начиная с Linux
4.3)
- Читает или
изменяет
наружный
набор
мандатов
вызывающей
нити
согласно
значению
arg2, которое
должно
быть одним
из
следующих:
- PR_CAP_AMBIENT_RAISE
- Мандат,
указанный
в arg3,
добавляется
в наружный
набор.
Указанный
мандат уже
должен
присутствовать
в
разрешающем
и
наследуемом
наборе. Эта
операция
неприменима,
если
установлен
бит
безопасности
SECBIT_NO_CAP_AMBIENT_RAISE.
- PR_CAP_AMBIENT_LOWER
- Мандат,
указанный
в arg3,
удаляется
из
наружного
набора.
- PR_CAP_AMBIENT_IS_SET
- Вызов prctl()
возвращает
1, если
мандат в arg3
присутствует
в наружном
наборе и 0,
если нет.
- PR_CAP_AMBIENT_CLEAR_ALL
- Все
мандаты
будут
удалены из
наружного
набора. Для
этой
операции
требуется
указать в
arg3
значение 0.
- В всех
перечисленных
выше
операциях
значения
arg4 и arg5
должны
быть равны
0.
- PR_CAPBSET_READ
(начиная с Linux
2.6.25)
- Возвращает
1 (как
результат
функции),
если
мандат,
указанный
в arg2, есть в
списке
мандатов
вызывающей
нити (capability bounding set),
или 0, если
нет.
Константы
мандатов
определены
в <linux/capability.h>.
Значениями
списка
мандатов
определяется,
может ли
процесс
получить
мандат
через
установку
набора
файловых
прав при
последующем
вызове execve(2).
- Если
мандат,
указанный
в arg2,
некорректен,
то вызов
завершится
с ошибкой
EINVAL.
- PR_CAPBSET_DROP
(начиная с Linux
2.6.25)
- Если
вызывающая
нить имеет
мандат CAP_SETPCAP
в своём
пользовательском
пространстве
имён, то
мандат,
указанный
в arg2,
удаляется
из списка
мандатов
вызывающей
нити. Любой
потомок
вызывающей
нити
унаследует
новый
сокращённый
список
мандатов.
- Вызов
завершается
с ошибками:
EPERM, если
вызывающая
нить не
имеет
мандата
CAP_SETPCAP; EINVAL, если
в arg2 указан
недопустимый
мандат; EINVAL,
если
файловые
мандаты не
включены в
ядре, в
этом
случае
списки
мандатов
не
поддерживаются.
- PR_SET_CHILD_SUBREAPER
(начиная с Linux
3.4)
- Если
значение
arg2 не равно 0,
то в
вызвавшем
процессе
устанавливается
атрибут
«сборщика
потомков»
(child subreaper); если
значение
arg2 равно 0, то
атрибут
удаляется.
- Сборщик
потомков
выполняет
функцию init(1)
для своих
потомков.
При
завершении
осиротевшего
процесса
(т. е. прямой
предок уже
завершил
выполнение),
его
родителем
станет
ближайший
действующий
сборщик-предок.
После
этого
вызов getppid() в
осиротевшем
процессе
будет
возвращать
PID
процесса-сборщика,
и когда
осиротевший
процесс
завершит
работу,
сборщик
получит
сигнал SIGCHLD и
сможет
запустить
wait(2) для
получения
состояния
завершения
потомка.
- Установка
данного
бита не
наследуется
потомками,
создаваемыми
fork(2) и clone(2).
Данное
значение
сохраняется
после execve(2).
- Назначение
процесса-сборщика
полезно в
инфраструктуре
управления
сеансами,
где
иерархическая
группа
процессов
управляется
процессом-сборщиком,
которому
нужно
сообщать,
когда один
из
процессов
— например,
служба,
выполнившая
двойное
создание (fork)
—
завершается
(возможно
для того,
чтобы её
можно было
перезапустить).
Некоторые
инфраструктуры
init(1)
(например,
systemd(1))
используют
a
процесс-сборщик
для этих
целей.
- PR_GET_CHILD_SUBREAPER
(начиная с Linux
3.4)
- Возвращает
значение
атрибута
«сборщика
потомков»
вызывающего
в
расположение,
указанное
(int *) arg2.
- PR_SET_DUMPABLE
(начиная с Linux
2.3.20)
- Установить
состояние
флага
«дампа»,
определяющего
создание
файла core
вызывающего
процесса
после
доставки
сигнала,
чьё
поведение
по
умолчанию
вызывает
создание
файла core.
- В ядрах по 2.6.12
включительно,
значение
arg2 должно
быть равно
0 (SUID_DUMP_DISABLE, от
процесса
не
остаётся
дампа) или 1
(SUID_DUMP_USER, после
процесса
остаётся
дамп).
Между
ядрами 2.6.13 и 2.6.17,
также было
разрешено
значение 2,
означающее
что от
любого
исполняемого
файла,
обычно
дампа не
остаётся,
но
суперпользователь
может это
сделать;
для
улучшения
безопасности
эта
возможность
была
удалена
(смотрите
также
описание
/proc/sys/fs/suid_dumpable в proc(5)).
- Обычно,
значение
этого
флага
равно 1.
Однако, оно
сбрасывается
в текущее
значение,
содержащееся
в файле
/proc/sys/fs/suid_dumpable
(которое по
умолчанию
равно 0), в
следующих
случаях:
- Изменён
эффективный
идентификатор
пользователя
или группы
процесса.
- Изменён
процессный
идентификатор
пользователя
или группы
файловой
системы
(смотрите
credentials(7)).
- Процесс
выполняет
(execve(2))
программу
с
установленным
битом set-user-ID
или set-group-ID, что
приводит к
изменению
идентификатора
эффективного
пользователя
или
эффективной
группы.
- Процесс
выполняет
(execve(2))
программу,
которая
имеет
файловые
мандаты
(смотрите
capabilities(7)), но
только
если
полученные
разрешенные
мандаты
превосходят
уже
разрешенные
для
процесса.
- Процессы,
для
которых
невозможен
дамп,
нельзя
присоединить
через
операцию
ptrace2() PTRACE_ATTACH;
подробности
смотрите в
ptrace(2).
- Если для
процесса
невозможен
дамп, то на
владение
файлами в
каталоге
процесса
/proc/[pid]
действуют
правила,
описанные
в proc(5).
- PR_GET_DUMPABLE
(начиная с Linux
2.3.20)
- Возвращает
(как
результат
функции)
текущее
состояние
флага
дампа
вызывающего
процесса.
- PR_SET_ENDIAN
(начиная с Linux
2.6.18, только
для PowerPC)
- Устанавливает
порядок
байт
вызывающего
процесса
равным
значению
arg2, которое
может быть
одним из:
PR_ENDIAN_BIG, PR_ENDIAN_LITTLE или
PR_ENDIAN_PPC_LITTLE (для PowerPC
псевдо
обратный
порядок (pseudo little
endian)).
- PR_GET_ENDIAN
(начиная с Linux
2.6.18, только
для PowerPC)
- Записывает
значение
порядка
байт
вызывающего
процесса
по адресу,
указанному
в (int *) arg2.
- PR_SET_FP_MODE
(начиная с Linux
4.0, только на
MIPS)
- На
архитектуре
MIPS код
пользовательского
пространства
можно
собирать
используя
ABI, который
позволяет
компоновку
с кодом,
имеющем
более
ограничительные
требования
для
плавающей
запятой (FP).
Например,
код
пользовательского
пространства
может
собираться
для цели O32 FPXX ABI
и
компоноваться
с кодом,
собранным
с одним из
более
ограничительных
FP32 или FP64 ABI. При
этом
требование
всего
процесса
устанавливается
в более
ограничительный
режим
плавающей
запятой.
- Так как
ядро не
знает в
каком
режиме
должен
запускаться
процесс и
ограничения
могут
измениться
во время
работы
процесса,
создана
операция
PR_SET_FP_MODE,
позволяющая
контролировать
режим
плавающей
запятой из
пользовательского
пространства.
- В
аргументе
(unsigned int) arg2
указывается
битовая
маска,
описывающая
используемый
режим
плавающей
запятой:
- PR_FP_MODE_FR
- Если это
бит
сброшен
(так
называемый
режим FR=0
или FR0), то
ширина 32
регистров
плавающей
запятой
равна 32, а
64-битные
регистры
представляются
в виде пары
регистров
(с чётными
и
нечётными
номерами;
регистры с
чётными
номерами
содержат 32
младших
бита, а с
нечётными
номерами 32
старших
бита).
- Если этот
бит
установлен
(есть
поддержка
в
оборудовании),
то ширина 32
регистров
плавающей
запятой
равна 64 (так
называемый
режим FR=1
или FR1).
Заметим,
что
современные
реализации
MIPS (MIPS R6 и новее)
поддерживают
только
режим FR=1.
- Приложения,
использующие
O32 FP32 ABI, могут
работать
только
когда этот
бит
сброшен
(FR=0; или они
могут
использоваться
с
включённым
FRE, смотрите
ниже).
Приложения,
использующие
O32 FP64 ABI (и O32 FP64A ABI,
существующий
для
предоставления
возможности
работы с
существующим
кодом FP32;
смотрите
ниже),
могут
работать
только
когда этот
бит
установлен
(FR=1).
Приложения,
использующие
O32 FPXX ABI, могут
работать и
с FR=0 и с FR=1.
- PR_FP_MODE_FRE
- Включает
эмуляцию
32-битного
режима
плавающей
запятой.
Когда этот
режим
включён,
эмуляция
32-битных
операций с
плавающей
запятой
выполняется
генерацией
исключения
на каждую
инструкцию,
использующую
32-битный
формат, и
ядро
обрабатывает
инструкцию
программно
(проблема
заключается
в
несоответствии
обработке
регистров
с
нечётными
номерами,
которые
содержатся
в 32 старших
битах
64-битных
регистров
с чётными
номерами
при режиме
FR=0 и в 32
младших
битах
64-битах
регистров
с
нечётными
номерами
при режиме
FR=1). При
включении
этого бита
необходимо,
чтобы код с
O32 FP32 ABI работал
с кодом O32 FPXX
или O32 FP64A ABI (для
которого
требуется
режим FR=1 FPU)
или когда
он
выполняется
на новой
аппаратуре
(MIPS R6 и новее), в
которой
нет
поддержки
режима FR=0,
когда
используется
двоичный
файл с FP32 ABI.
- Заметим,
что этот
режим
приобретает
смысл
только,
если FPU в
64-битном
режиме (FR=1).
- Также
заметим,
что
использование
эмуляции
по
определению
уменьшает
производительность
и её нужно,
по
возможности,
избегать.
- В N32/N64 ABI всегда
используется
64-битный
режим
плавающей
запятой,
поэтому
эмуляция FPU
не
требуется
и FPU всегда
работает в
режиме FR=1.
- Данный
параметр, в
основном,
предназначен
для
динамического
компоновщика
(ld.so(8)).
- Аргументы
arg3, arg4 и arg5
игнорируются.
- PR_GET_FP_MODE
(начиная с Linux
4.0, только на
MIPS)
- Возвращает
текущий
режим
плавающей
запятой
(смотрите
описание
PR_SET_FP_MODE).
- При
успешном
выполнении
возвращается
битовая
маска,
представляющая
текущий
режим
плавающей
запятой.
- Аргументы
arg2, arg3, arg4 и arg5
игнорируются.
- PR_SET_FPEMU
(начиная с Linux
2.4.18, 2.5.9, только
для ia64)
- Устанавливает
значение
управляющих
эмуляцией
плавающей
точки бит
равным
значению
arg2. Для
негласной
(silently)
эмуляции
операций с
плавающей
точкой
передайте
PR_FPEMU_NOPRINT; при
указании
PR_FPEMU_SIGFPE
операции с
плавающей
точкой не
эмулируются,
а
посылается
сигнал SIGFPE.
- PR_GET_FPEMU
(начиная с Linux
2.4.18, 2.5.9, только
для ia64)
- Записывает
значение
управляющих
бит
эмуляции
плавающей
точки по
адресу,
указанному
в (int *) arg2.
- PR_SET_FPEXC
(начиная с Linux
2.4.21, 2.5.32, только
для PowerPC)
- Устанавливает
режим
исключений
плавающей
точки
равным arg2.
Значение
PR_FP_EXC_SW_ENABLE
включает
использование
FPEXC для
исключений
плавающей
точки, PR_FP_EXC_DIV —
исключение
деления на
ноль, PR_FP_EXC_OVF —
исключение
переполнения,
PR_FP_EXC_UND —
исключение
исчерпания,
PR_FP_EXC_RES —
исключение
неточного
результата,
PR_FP_EXC_INV —
исключение
недопустимой
операции,
PR_FP_EXC_DISABLED
отключает
исключения
плавающей
точки, PR_FP_EXC_NONRECOV
включает
режим
асинхронного
невосстанавливаемого
исключения,
PR_FP_EXC_ASYNC
включает
режим
асинхронного
восстанавливаемого
исключения,
PR_FP_EXC_PRECISE
включает
режим
исключения
точности.
- PR_GET_FPEXC
(начиная с Linux
2.4.21, 2.5.32, только
для PowerPC)
- Записывает
значение
режима
исключений
плавающей
точки по
адресу,
указанному
в (int *) arg2.
- PR_SET_KEEPCAPS
(начиная с Linux
2.2.18)
- Устанавливает
флаг
вызывающей
нити
«оставить
мандаты».
Он описан в
capabilities(7).
Значение
arg2 должно
быть или 0
(сбросить
флаг) или 1
(установить
флаг).
Значение
флага
«оставить
мандаты»
будет
сброшено в
0 при
последующих
вызовах
execve(2).
- PR_GET_KEEPCAPS
(начиная с Linux
2.2.18)
- Возвращает
(как
результат
функции)
текущее
состояние
флага
«оставить
мандаты»
вызывающей
нити.
Описание
флага
смотрите в
capabilities(7).
- PR_MCE_KILL
(начиная с Linux
2.6.32)
- Устанавливает
политику
удаления (kill)
при
обнаружении
повреждения
памяти
машинной
проверкой
для
вызывающей
нити. Если
значение
arg равно
PR_MCE_KILL_CLEAR, то
политика
удаления (kill)
сбрасывается
и
используется
системная
установка
по
умолчанию.
(Значение
системной
установки
по
умолчанию
определено
в /proc/sys/vm/memory_failure_early_kill;
смотрите
proc(5).)
Значение
arg2, равное
PR_MCE_KILL_SET,
указывает
использовать
политику
удаления,
заданную в
нити. В
этом
случае
значение
arg3
определяет
политику:
раннее
удаление
(PR_MCE_KILL_EARLY),
позднее
удаление
(PR_MCE_KILL_LATE) или
системная
установка
по
умолчанию
(PR_MCE_KILL_DEFAULT). При
раннем
удалении
нить
получает
сигнал SIGBUS
сразу же
при
аппаратном
обнаружении
повреждения
памяти в её
адресном
пространстве.
В режиме
позднего
удаления
процесс
будет
удалён
только
когда
обратится
к
повреждённой
странице.
Более
подробную
информацию
о сигнале
SIGBUS
смотрите в
sigaction(2).
Политика
наследуется
потомками.
Значения
остальных
неиспользуемых
аргументов
prctl() должны
быть равны
нулю для
совместимости
в будущем.
- PR_MCE_KILL_GET
(начиная с Linux
2.6.32)
- Возвращает
значение
политики
удаления
при
машинной
проверке
для
текущего
процесса.
Значения
всех
неиспользуемых
аргументов
prctl() должны
быть равны
нулю.
- PR_SET_MM
(начиная с Linux
3.3)
- Изменяет
определённые
поля
дескриптора
карты
памяти
ядра
вызывающего
процесса.
Обычно,
значения
этих полей
задаются
ядром или
динамическим
загрузчиком
(подробней
смотрите
ld.so(8)), и
обычные
приложения
не должны
использовать
эту
возможность.
Однако,
есть
случаи
(самоизменяющиеся
программы),
где для
программы
может
оказаться
полезным
изменение
своей
карты
памяти.
- Вызывающий
процесс
должен
иметь
мандат CAP_SYS_RESOURCE.
Значения
аргумента
arg2 описаны
далее, а в arg3
задаётся
новое
значение.Аргументы,
arg4 и arg5, если
не
используются,
должны
быть равно
нулю.
- Начиная с Linux
3.10, данное
свойство
доступно
всегда. До Linux
3.10 это
свойство
доступно
только,
если ядро
собрано с
параметром
CONFIG_CHECKPOINT_RESTORE.
- PR_SET_MM_START_CODE
- Устанавливает
адрес
памяти,
выше
которого
располагается
код
программы,
который
может
выполняться.
Соответствующая
область
памяти
должна
быть
доступна
на чтение и
выполнение,
но не на
запись или
быть
общедоступной
(подробности
смотрите в
mprotect(2) и mmap(2)).
- PR_SET_MM_END_CODE
- Устанавливает
адрес
памяти,
ниже
которого
располагается
код
программы,
который
может
выполняться.
Соответствующая
область
памяти
должна
быть
доступна
на чтение и
выполнение,
но не на
запись или
быть
общедоступной.
- PR_SET_MM_START_DATA
- Устанавливает
адрес
памяти,
выше
которого
располагаются
инициализированные
и не
инициализированные
(bss) данные.
Соответствующая
область
памяти
должна
быть
доступна
на чтение и
запись, но
не на
выполнение
или быть в
общем
доступе.
- PR_SET_MM_END_DATA
- Устанавливает
адрес
памяти,
ниже
которого
располагаются
инициализированные
и не
инициализированные
(bss) данные.
Соответствующая
область
памяти
должна
быть
доступна
на чтение и
запись, но
не на
выполнение
или быть в
общем
доступе.
- PR_SET_MM_START_STACK
- Устанавливает
начальный
адрес
стека.
Соответствующая
область
памяти
должна
быть
доступна
на чтение и
запись.
- PR_SET_MM_START_BRK
- Устанавливает
адрес
памяти,
выше
которого
можно
расширять
программную
кучу с
помощью
вызова brk(2).
Адрес
должен
быть
больше
конечного
адреса
текущего
программного
сегмента
данных.
Также,
суммарный
размер
полученной
кучи и
сегмента
данных не
может
превышать
ограничитель
ресурса
RLIMIT_DATA
(смотрите
setrlimit(2)).
- PR_SET_MM_BRK
- Устанавливает
текущее
значение
brk(2).
Требования
к адресу те
же, что и в
параметре
PR_SET_MM_START_BRK.
Начиная с
Linux 3.5 доступны
следующие
параметры:
- PR_SET_MM_ARG_START
- Задаёт
адрес, выше
которого
размещена
командная
строка
программы.
- PR_SET_MM_ARG_END
- Задаёт
адрес, ниже
которого
размещена
командная
строка
программы.
- PR_SET_MM_ENV_START
- Задаёт
адрес, выше
которого
размещено
окружение
программы.
- PR_SET_MM_ENV_END
- Задаёт
адрес, ниже
которого
размещено
окружение
программы.
- Адрес,
передаваемый
с PR_SET_MM_ARG_START, PR_SET_MM_ARG_END,
PR_SET_MM_ENV_START и PR_SET_MM_ENV_END,
должен
принадлежать
области
стека
процесса.
То есть,
соответствующая
память
должна
быть
доступна
на чтение,
запись и (в
зависимости
от
настройки
ядра) у неё
должен
быть
установлен
атрибут
MAP_GROWSDOWN
(смотрите
mmap(2)).
- PR_SET_MM_AUXV
- Задаёт
новый
вспомогательный
вектор (auxiliary vector).
В
аргументе
arg3 должен
передаваться
адрес
вектора. В
аргументе
arg4 — размер
вектора.
- PR_SET_MM_EXE_FILE
- Заменяет
символьную
ссылку /proc/pid/exe
новой,
указывающей
на новый
исполняемый
файл,
задаваемый
файловым
дескриптором
в
аргументе
arg3.
Файловый
дескриптор
должен
быть
получен с
помощью
обычного
вызова open(2).
- Для
изменения
символьной
ссылки
необходимо
отключить
(unmap) все
существующие
исполняемые
области
памяти,
включая
созданные
самим
ядром
(например,
ядро,
обычно,
создаёт,
как
минимум,
исполняемую
область
памяти для
раздела ELF
.text).
- Второе
ограничение
в том, что
такие
переходы
можно
выполнить
только
один раз за
время
существования
процесса.
Дальнейшие
попытки
будут
отброшены.
Это должно
помочь
системным
администраторам
отследить
необычные
переходы
символьных
ссылок во
всех
работающих
процессах
системы.
Начиная с
Linux 3.18 доступны
следующие
параметры:
- PR_SET_MM_MAP
- Предоставляет
однократный
доступ ко
всем
адресам,
переданным
в struct prctl_mm_map
(определена
в <linux/prctl.h>). В
аргументе
arg4 должен
указываться
размер
структуры.
- Эта
возможность
доступна
только,
если ядро
собрано с
параметром
CONFIG_CHECKPOINT_RESTORE.
- PR_SET_MM_MAP_SIZE
- Возвращает
размер struct
prctl_mm_map, который
ожидает
ядро. Это
позволяет
пользователю
подобрать
совместимую
структуру.
Аргумент
arg4 должен
быть
указателем
на unsigned int.
- Эта
возможность
доступна
только,
если ядро
собрано с
параметром
CONFIG_CHECKPOINT_RESTORE.
- PR_MPX_ENABLE_MANAGEMENT,
PR_MPX_DISABLE_MANAGEMENT
(начиная с Linux
3.19)
- Включает
или
выключает
управление
таблицами
границ Memory Protection
eXtensions (MPX) из ядра.
Аргументы
arg2, arg3, arg4 и arg5
должны
быть равно
0.
- MPX —
полуаппаратный
механизм
проверки
границ
указателей.
Он состоит
из набора
регистров,
хранящих
информацию
о границах
и наборе
специальных
префиксов
инструкций,
которые
указывают
ЦП, в каких
инструкциях
нужно
проверить
границы.
Число
регистров
ограничено
и когда
указателей
становится
больше чем
регистров,
их
содержимое
нужно
«засыпать»
в набор
таблиц. Эти
таблицы
называются
«таблицами
границ» (bounds tables),
а для
управления
их
заполнением
и
освобождением
из ядра
существуют
операции MPX
prctl().
- Когда
управление
разрешено,
ядро
начинает
следить за
выделением
и
освобождением
таблиц
границ. Это
делается
через
ловлю
исключений
#BR, которые
возникают
при первом
использовании
отсутствующей
таблицы
границ и в
результате
доставляется
исключение
в
пользовательское
пространство,
там
выделяется
таблица и
заполняется
каталог
границ с
расположением
новой
таблицы.
Для
освобождения
ядро
проверяет
есть ли
таблицы
границ для
нераспределённой
памяти и
освобождает
их если
есть.
- Перед
включением
управления
MPX с помощью
PR_MPX_ENABLE_MANAGEMENT
приложение
сначала
должно
выделить
буфер в
пользовательском
пространстве
для
каталог
границ и
поместить
расположение
этого
каталоге в
регистр
bndcfgu.
- Эти вызовы
завершаются
ошибкой,
если ЦП или
ядро не
поддерживают
MPX.
Поддержка
MPX в ядре
включается
параметром
настройки
CONFIG_X86_INTEL_MPX. Вы
можете
проверить
наличие
поддержки
MPX в ЦП
прочитав
бит «mpx» в CPUID
следующей
командой:
-
cat /proc/cpuinfo | grep ' mpx '
- Нить может
не
переключиться
в
«длинный»
режим
(64-битный)
при
включённом
MPX.
- Эти вызовы
влияют на
все нити
процесса.
- Потомок fork(2)
наследует
состояние
управления
MPX. Во время
execve(2)
управление
MPX
сбрасывается
в
состояние,
как если бы
выполнился
вызов
PR_MPX_DISABLE_MANAGEMENT.
- Дополнительную
информацию
по Intel MPX
смотрите в
файле
исходного
кода ядра
Documentation/x86/intel_mpx.txt.
- PR_SET_NAME
(начиная с Linux
2.6.9)
- Назначает
имя
вызывающей
нити,
используя
значение
памяти,
переданное
в
указателе
(char *) arg2. Имя
может быть
не более 16,
включая
завершающий
байт null (если
длина
строки,
включая
завершающий
null,
превышает
16 байт, то
строка
просто
обрезается).
Это то же
атрибут,
который
можно
установить
через pthread_setname_np(3)
и получить
с помощью
pthread_getname_np(3). Также
этот
атрибут
доступен
через
/proc/self/task/[tid]/comm, где tid
— имя
вызывающей
нити.
- PR_GET_NAME
(начиная с Linux
2.6.11)
- Записывает
имя
вызывающей
нити в
буфер,
указанный
в (char *) arg2.
Буфер
должен
быть не
более 16
байт;
полученная
строка
будет
завершаться
null.
- PR_SET_NO_NEW_PRIVS
(начиная с Linux
3.5)
- Устанавливает
в
вызывающей
нити бит
no_new_privs равным
arg2. Если
значение
no_new_privs равно 1,
то execve(2) не
выдаст
прав
никому, кто
бы не мог
это
сделать
без вызова
execve(2)
(например,
без битов
прав
режима set-user-ID и
set-group-ID и
файловых
мандатов).
После того,
как бит
установлен,
сбросить
его нельзя.
Значение
бита
наследуется
потомками,
созданными
с помощью
fork(2) и clone(2), и
сохраняется
при execve(2).
- Начиная с Linux
4.10, значения
бита нити
no_new_privs
отражено в
поле NoNewPrivs
файла /proc/[pid]/status.
- Дополнительную
информацию
смотрите в
файле
исходного
кода ядра
Documentation/userspace-api/no_new_privs.rst
(или в
Documentation/prctl/no_new_privstxt до Linux 4.13).
Также
смотрите
seccomp(2).
- PR_GET_NO_NEW_PRIVS
(начиная с Linux
3.5)
- Возвращает
значение
(как
результат
функции)
бита no_new_privs в
вызывающей
нити.
Значение 0
соответствует
обычному
поведению
execve(2).
Значение 1
показывает,
что execve(2)
будет
работать в
ограничивающем
права
режиме, как
описано
ранее.
- PR_SET_PDEATHSIG
(начиная с Linux
2.1.57)
- Устанавливает
значение
сигнала,
приходящего
процессу
при
завершении
работы
родителя,
равным arg2
(это
значение
может быть
от 1..maxsig или 0
для
снятия).
Этот
сигнал
получит
вызывающий
процесс,
когда его
родитель
завершится.
Это
значение
очищается
у потомка
при
выполнении
fork(2) и
(начиная с Linux
2.4.36 / 2.6.23), если
выполняется
файл с
установленными
set-user-ID, set-group-ID или
файл,
имеющий
привязанные
мандаты
(смотрите
capabilities(7)). Это
значение
сохраняется
после
вызова execve(2).
- Предупреждение:
«родителем»
здесь
считается
нить,
создавшая
этот
процесс.
Иначе
говоря,
сигнал
будет
послан при
завершении
нити
(например,
с помощью
pthread_exit(3)), а не
всех нитей
родительского
процесса.
- PR_GET_PDEATHSIG
(начиная с Linux
2.3.15)
- Записывает
текущее
значение
сигнала о
завершении
работы
родительского
процесса
по адресу,
указанному
в (int *) arg2.
- PR_SET_PTRACER
(начиная с Linux
3.4)
- Имеет
смысл,
только
если
включён Yama LSM и
в режиме 1
(«ограниченный
ptrace»,
значение
доступно в
/proc/sys/kernel/yama/ptrace_scope).
Когда
«идентификатор
процесса
ptracer»
передаётся
в arg2,
вызывающий
объявляет,
что
процесс ptracer
может
выполнить
ptrace(2), как
если бы он
был прямым
предком
процесса.
Каждая
операция
PR_SET_PTRACER
заменяет
предыдущий
«идентификатор
процесса
ptracer».
Применение
PR_SET_PTRACER с
значением
arg2 равным 0
очищает
«идентификатор
процесса
ptracer»
вызывающего.
Если arg2
равно PR_SET_PTRACER_ANY,
то
ограничения
ptrace,
предоставленные
Yama
отключаются
для
вызывающего
процесса.
- Дополнительную
информацию
смотрите в
файле
исходного
кода ядра
Documentation/admin-guide/LSM/Yama.rst (или
в Documentation/security/Yama.txt до Linux
4.13).
- PR_SET_SECCOMP
(начиная с Linux
2.6.23)
- Устанавливает
режим
безопасных
вычислений
(seccomp) в
вызывающей
нити, в
котором
ограничен
список
доступных
системных
вызовов.
Новый
системный
вызов seccomp(2)
предоставляет
большие
возможности
чем PR_SET_SECCOMP.
- Режим seccomp
выбирается
из arg2
(константы
seccomp
определены
в <linux/seccomp.h>).
- Если
значение
arg2 равно
SECCOMP_MODE_STRICT, то в
нити
доступны
только
системные
вызовы read(2),
write(2), _exit(2) (но не
exit_group(2)) и sigreturn(2).
При
запуске
других
системных
вызовов
генерируется
сигнал SIGKILL.
Режим
безопасных
вычислений
полезен
для
вычислительных
приложений,
которым
может
потребоваться
выполнить
недоверительный
байт-код,
возможно
полученный
при чтении
из канала
или сокета.
Эта
операция
доступна
только,
если в ядре
включён
параметр
CONFIG_SECCOMP.
- Если
значение
arg2 равно
SECCOMP_MODE_FILTER
(начиная с Linux
3.5), то список
разрешённых
системных
вызовов
определяется
указателем
(arg3) на
пакетный
фильтр Berkeley.
Аргумент
указывает
на struct sock_fprog; в
структуре
можно
описать
фильтр и
произвольных
системных
вызовов и
их
аргументов.
Этот режим
доступен
только,
если ядро
собрано с
параметром
CONFIG_SECCOMP_FILTER.
- Если в
фильтрах
SECCOMP_MODE_FILTER
разрешён
fork(2), то режим
seccomp
наследуется
потомками,
создаваемыми
fork(2); если
разрешён
execve(2), то
режим seccomp
сохраняется
при execve(2).
Если в
фильтрах
разрешены
prctl(), то могут
быть
добавлены
дополнительные
фильтры;
они
применяются
до тех пор
пока не
будет
найдено
запрещение.
- Дополнительную
информацию
смотрите в
файле
исходного
кода ядра
Documentation/userspace-api/seccomp_filter.rst
(или в
Documentation/prctl/seccomp_filter.txt до Linux
4.13).
- PR_GET_SECCOMP
(начиная с Linux
2.6.23)
- Возвращает
значение
(как
результат
функции)
режима
безопасных
вычислений
вызвавшей
нити. Если
вызывающий
не
работает в
режиме
безопасных
вычислений,
то
возвращается
0; если
вызывающий
находится
в режиме
ограниченных
безопасных
вычислений,
то вызов prctl()
приведёт к
отправке
процессу
сигнала SIGKILL.
Если
вызывающий
работает в
режиме
фильтрации
и данный
системный
вызов
разрешён в
фильтрах seccomp,
то
возвращается
2; в
противном
случае
процесс
завершается
по сигналу
SIGKILL. Эта
операция
доступна
только,
если ядро
собрано с
параметром
CONFIG_SECCOMP.
- Начиная с Linux
3.8 в поле Seccomp
файла /proc/[pid]/status
предоставляется
метод
получения
той же
информации,
без риска
уничтожения
процесса;
смотрите
proc(5).
- PR_SET_SECUREBITS
(начиная с Linux
2.6.26)
- Устанавливает
значение
флагов
«securebits»
вызывающей
нити
равным
значению
arg2.
Смотрите
capabilities(7).
- PR_GET_SECUREBITS
(начиная с Linux
2.6.26)
- Возвращает
(как
результат
функции)
флаги «securebits»
вызывающей
нити.
Смотрите
capabilities(7).
- PR_SET_THP_DISABLE
(начиная с Linux
3.15)
- Задать
состояние
флага «THP disable»
вызывающей
нити. Если
arg2 не равно
нулю, то
флаг
устанавливается,
иначе
очищается.
Установка
этого
флага
предоставляет
метод
отключения
прозрачных
огромных
страниц
для
заданий,
код
которых
нельзя
изменить и
использование
обработчика
malloc с madvise(2)
невозможно
(т. е., место
под данные
выделено
статически).
Значение
флага «THP disable»
наследуется
потомком,
создаваемым
fork(2) и
сохраняется
после execve(2).
- PR_TASK_PERF_EVENTS_DISABLE
(начиная с Linux
2.6.31)
- Отключает
все
счётчики
производительности,
прикреплённые
к
вызывающему
процессу,
не
учитывая,
были ли они
созданы
этим
процессом
или
каким-то
другим.
Счётчики
производительности,
созданные
вызывающим
процессом
для других
процессов,
не
отключаются.
Подробности
о
счётчиках
производительности
приведены
в файле
ядра Linux tools/perf/design.txt.
- Сначала
назывался
PR_TASK_PERF_COUNTERS_DISABLE;
переименован
(числовое
значение
не
изменилось)
в Linux 2.6.32.
- PR_TASK_PERF_EVENTS_ENABLE
(начиная с Linux
2.6.31)
- Противоположное
действие
PR_TASK_PERF_EVENTS_DISABLE;
включает
счётчики
производительности,
прикреплённые
к
вызывающему
процессу.
- Сначала
назывался
PR_TASK_PERF_COUNTERS_ENABLE;
переименован
в Linux 2.6.32.
- PR_GET_THP_DISABLE
(начиная с Linux
3.15)
- Возвращает
текущее
значение
(как
результат
функции)
флага «THP disable»
вызывающей
нити: 1 —
флаг
установлен;
0 — нет.
- PR_GET_TID_ADDRESS
(начиная с Linux
3.5)
- Возвращает
адрес clear_child_tid,
заданный
set_tid_address(2) и clone(2) с
флагом
CLONE_CHILD_CLEARTID, в
расположение,
указанное
в (int **) arg2. Эта
возможность
доступна
только,
если ядро
собрано с
параметром
CONFIG_CHECKPOINT_RESTORE.
Заметим,
что так как
системный
вызов prctl() не
содержит
совместимой
реализации
для AMD64 x32 и MIPS n32 ABI и
ядро
записывает
указатель
размером с
ядерный, то
эта
операция
требует
пользовательский
буфер в 8 (не 4)
байт в этих
ABI.
- PR_SET_TIMERSLACK
(начиная с Linux
2.6.28)
- Каждая
нити имеет
два
связанных
с таймером
значения
допуска:
значение
«по
умолчанию»
и
«текущее»
значение.
Эта
операция
изменяет
«текущее»
значение
допуска
таймера
вызывающей
нити. Если
наносекундное
значение
из arg2
больше
нуля, то
оно
присваивается
«текущему»
значению.
Если arg2
меньше или
равно 0, то
«текущий»
допуск
таймера
нити
сбрасывается
в значение
допуска
таймера
«по
умолчанию».
- «Текущий»
допуск
таймера
используется
ядром для
группировки
таймерных
окончаний
при
вызовах
нити,
которые
происходят
очень
часто; как
следствие,
таймерные
окончания
нити могут
быть равны
до
указанной
наносекундной
задержки
(но никогда
не будут
истекать
ранее).
Группировка
таймерных
окончаний
может
помочь
сократить
потребление
энергии
системой, в
следствии
сокращения
количества
пробуждений
ЦП.
- Таймерные
окончания,
на которые
влияет
допуск
таймера,
устанавливаются
select(2), pselect(2), poll(2), ppoll(2),
epoll_wait(2), epoll_pwait(2), clock_nanosleep(2),
nanosleep(2) и futex(2) (и,
следовательно,
все
библиотечными
функциями,
реализованными
через futex:
pthread_cond_timedwait(3), pthread_mutex_timedlock(3),
pthread_rwlock_timedrdlock(3), pthread_rwlock_timedwrlock(3)
и sem_timedwait(3)).
- Допуск
таймера не
применяется
к нитям,
которые
планируются
в
соответствии
с
политикой
реального
времени
(смотрите
sched_setscheduler(2)).
- При
создании
новой нити
этим двум
значениям
присваивается
значение
«текущего»
допуска
создающей
нити. После
этого нить
может
подстроить
значение
своего
«текущего»
допуска
таймера с
помощью
PR_SET_TIMERSLACK
(значение
по
умолчанию
не может
быть
изменено).
Значения
допуска
таймера
для init (PID 1),
предка
всех
процессов,
равно 50000
наносекунд
(50
микросекунд).
Значения
допуска
таймера
сохраняются
при вызове
execve(2).
- Начиная с Linux
4.6 значение
«текущего»
допуска
таймера
любого
процесса
можно
получить и
изменить
через файл
/proc/[pid]/timerslack_ns.
Смотрите
proc(5).
- PR_GET_TIMERSLACK
(начиная с Linux
2.6.28)
- Возвращает
значение
«текущего»
допуска
(как
результат
функции)
таймера
вызывающей
нити.
- PR_SET_TIMING
(начиная с Linux
2.6.0-test4)
- Включает
использование
обычного
статистического
временного
режима
выполнения
процесса (process
timing) или
точного
режима на
основе
меток
времени (timestamp-based
process timing), при
передаче
PR_TIMING_STATISTICAL или
PR_TIMING_TIMESTAMP в arg2.
Действия
для PR_TIMING_TIMESTAMP
пока не
реализованы
(попытка
установить
этот режим
приведёт к
ошибке EINVAL).
- PR_GET_TIMING
(начиная с Linux
2.6.0-test4)
- Возвращает
(как
результат
функции)
тип
используемого
в данный
момент
временного
режима
выполнения
процесса.
- PR_SET_TSC
(начиная с Linux
2.6.26, только
для x86)
- Устанавливает
состояние
флага,
определяющего
может ли
процесс
прочитать
счётчик
метки
времени (timestamp
counter). Значение
PR_TSC_ENABLE в arg2
разрешает
чтение, PR_TSC_SIGSEGV
включает
генерацию
SIGSEGV, если
процесс
пытается
прочитать
счётчик
метки
времени.
- PR_GET_TSC
(начиная с Linux
2.6.26, только
для x86)
- Записывает
значение
флага,
определяющего
может ли
быть
прочитан
счётчик
метки
времени (timestamp
counter), по
адресу,
указанному
в (int *) arg2.
- PR_SET_UNALIGN
- (только
для: ia64,
начиная с Linux
2.3.48; parisc, начиная
с Linux 2.6.15; PowerPC,
начиная с Linux
2.6.18; Alpha, начиная
с Linux 2.6.22; sh,
начиная с Linux
2.6.34; tile, начиная
с Linux 3.12)
Устанавливает
значение
битов
контроля
доступа
выравнивания
равным
значению
arg2. При
значении
PR_UNALIGN_NOPRINT
пользовательский
доступ без
выравнивания
без
уведомления
исправляется,
а при PR_UNALIGN_SIGBUS
генерируется
сигнал SIGBUS.
На Alpha также
поддерживается
дополнительный
флаг со
значением 4
(именованная
константа
отсутствует),
который
указывает
ядру не
исправлять
невыровненный
доступ
(аналогично
флагу UAC_NOFIX в
операции
SSI_NVPAIRS
системного
вызова setsysinfo()
на Tru64).
- PR_GET_UNALIGN
- (информацию
о версиях и
архитектурах
смотрите в
PR_SET_UNALIGN)
Записывает
значение
битов
контроля
доступа
выравнивания
по адресу,
указанному
в (unsigned int *) arg2.
ВОЗВРАЩАЕМОЕ
ЗНАЧЕНИЕ
При
успешном
выполнении
для
операций
PR_GET_DUMPABLE, PR_GET_KEEPCAPS, PR_GET_NO_NEW_PRIVS,
PR_GET_THP_DISABLE, PR_CAPBSET_READ, PR_GET_TIMING,
PR_GET_TIMERSLACK, PR_GET_SECUREBITS, PR_MCE_KILL_GET,
PR_CAP_AMBIENT+PR_CAP_AMBIENT_IS_SET, и
(если
возвращается)
PR_GET_SECCOMP
возвращаются
неотрицательные
значения,
описанные
ранее. При
успешном
выполнении
для
остальных
значений
option
возвращается
0. При ошибке
возвращается
-1, а errno
устанавливается
в
соответствующее
значение.
ОШИБКИ
- EACCES
- Значение
option равно
PR_SET_SECCOMP и arg2
равно SECCOMP_MODE_FILTER,
но процесс
не имеет
мандата
CAP_SYS_ADMIN или
установленного
атрибута
no_new_privs
(смотрите
обсуждение
PR_SET_NO_NEW_PRIVS выше).
- EACCES
- Значение
option равно PR_SET_MM,
а arg3 — PR_SET_MM_EXE_FILE,
файл не
является
исполняемым.
- EBADF
- Значение
option равно PR_SET_MM,
arg3 — PR_SET_MM_EXE_FILE, и
файловый
дескриптор,
переданный
в arg4,
некорректен.
- EBUSY
- Значение
option равно PR_SET_MM,
arg3 — PR_SET_MM_EXE_FILE, и
это вторая
попытка
изменить
символьную
ссылку /proc/pid/exe,
что
запрещено.
- EFAULT
- В arg2 указан
неправильный
адрес.
- EFAULT
- Значение
option равно
PR_SET_SECCOMP, arg2
равно SECCOMP_MODE_FILTER,
система
была
собрана с
CONFIG_SECCOMP_FILTER и arg3
содержит
некорректный
адрес.
- EINVAL
- Не
распознано
значение
option.
- EINVAL
- Значение
option равно PR_MCE_KILL,
PR_MCE_KILL_GET или PR_SET_MM, и
неиспользуемые
аргументы
prctl() не равны
нулю.
- EINVAL
- Неверное
значение
arg2 для
указанной
в option
операции.
- EINVAL
- Значение
option равно
PR_SET_SECCOMP или PR_GET_SECCOMP,
и ядро не
собрано с
параметром
CONFIG_SECCOMP.
- EINVAL
- Значение
option равно
PR_SET_SECCOMP, arg2
равно SECCOMP_MODE_FILTER
и ядро было
собрано
без CONFIG_SECCOMP_FILTER.
- EINVAL
- Значение
option равно PR_SET_MM
и одно из
следующего
является
истиной:
- Значение
arg4 или arg5 не
равно
нулю;
- Значение
arg3 больше
TASK_SIZE
(ограничение
на размер
пользовательского
адресного
пространства
для этой
архитектуры);
- Значение
arg2 равно
PR_SET_MM_START_CODE, PR_SET_MM_END_CODE,
PR_SET_MM_START_DATA, PR_SET_MM_END_DATA
или PR_SET_MM_START_STACK, и
права на
соответствующую
область
памяти не
удовлетворяют
требованиям;
- Значение
arg2 равно
PR_SET_MM_START_BRK или PR_SET_MM_BRK,
и значение
arg3 меньше
или равно
концу
сегмента
данных, или
было бы
превышено
ограничение
ресурса
RLIMIT_DATA.
- EINVAL
- Значение
option равно
PR_SET_PTRACER и
значение
arg2 не равно 0,
PR_SET_PTRACER_ANY или PID
существующего
процесса.
- EINVAL
- Значение
option равно
PR_SET_PDEATHSIG и
значение
arg2 не
является
корректным
номером
сигнала.
- EINVAL
- Значение
option равно
PR_SET_DUMPABLE и
значение
arg2 не равно
SUID_DUMP_DISABLE или
SUID_DUMP_USER.
- EINVAL
- Значение
option равно
PR_SET_TIMING и
значение
arg2 не равно
PR_TIMING_STATISTICAL.
- EINVAL
- Значение
option равно
PR_SET_NO_NEW_PRIVS и
значение
arg2 не равно 1
или arg3, arg4 или
arg5 не равны
нулю.
- EINVAL
- Значение
option равно
PR_GET_NO_NEW_PRIVS и
значения
arg2, arg3, arg4 или arg5
не равны
нулю.
- EINVAL
- Значение
option равно
PR_SET_THP_DISABLE и arg3, arg4
или arg5 не
равны
нулю.
- EINVAL
- Значение
option равно
PR_GET_THP_DISABLE и
значения
arg2, arg3, arg4 или arg5
не равны
нулю.
- EINVAL
- Значение
option равно
PR_CAP_AMBIENT и
неиспользуемый
аргумент
(arg4, arg5 или, в
случае
PR_CAP_AMBIENT_CLEAR_ALL, arg3) не
равен нулю;
или arg2
содержит
некорректное
значение;
или arg2
равно PR_CAP_AMBIENT_LOWER,
PR_CAP_AMBIENT_RAISE или
PR_CAP_AMBIENT_IS_SET и в arg3
указан
некорректный
мандат.
- ENXIO
- Значение
option было
PR_MPX_ENABLE_MANAGEMENT или
PR_MPX_DISABLE_MANAGEMENT и ядро
или ЦП не
поддерживают
управление
MPX.
Проверьте,
что ядро и
процессор
поддерживают
MPX.
- EOPNOTSUPP
- Значение
option равно
PR_SET_FP_MODE и arg2
содержит
неправильное
или
неподдерживаемое
значение.
- EPERM
- Значение
option равно
PR_SET_SECUREBITS, и
вызывающий
не имеет
мандата
CAP_SETPCAP, или
пытается
сбросить
«заблокированный»
флаг, или
пытается
установить
флаг, для
которого
установлен
соответствующий
заблокированный
флаг
(смотрите
capabilities(7)).
- EPERM
- Значение
option равно
PR_SET_KEEPCAPS, и у
вызывающего
установлен
флаг SECBIT_KEEP_CAPS_LOCKED
(смотрите
capabilities(7)).
- EPERM
- Значение
option равно
PR_CAPBSET_DROP, и
вызывающий
не имеет
мандата
CAP_SETPCAP.
- EPERM
- Значение
option равно PR_SET_MM,
и
вызывающий
не имеет
мандата
CAP_SYS_RESOURCE.
- EPERM
- Значение
option равно
PR_CAP_AMBIENT и arg2
равно PR_CAP_AMBIENT_RAISE,
но мандат,
указанный
в arg3,
отсутствует
в
разрешительном
или
унаследованном
наборе
мандатов,
или был
установлен
бит
безопасности
PR_CAP_AMBIENT_LOWER.
ВЕРСИИ
Системный
вызов prctl()
впервые
появился в
Linux 2.1.57.
СООТВЕТСТВИЕ
СТАНДАРТАМ
Данный
вызов
существует
только в Linux. В
IRIX есть
системный
вызов prctl()
(также
представленный
в Linux 2.1.44 как irix_prctl на
архитектуре
MIPS)
объявленный
как
ptrdiff_t prctl(int option, int arg2, int arg3);
а также
операции,
позволяющие
получить
максимальное
количество
процессов
для
каждого
пользователя,
максимальное
количество
процессоров,
которое
может
использовать
вызывающий
процесс;
определить,
блокирован
ли
заданный
процесс;
получить
или
установить
максимальный
размер
стека и т. д.