Scroll to navigation

PRCTL(2) Руководство программиста Linux PRCTL(2)

ИМЯ

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>, значения остальных аргументов зависят от указываемого типа. Первый аргумент может принимать следующие значения:

Читает или изменяет наружный набор мандатов вызывающей нити согласно значению arg2, которое должно быть одним из следующих:
Мандат, указанный в arg3, добавляется в наружный набор. Указанный мандат уже должен присутствовать в разрешающем и наследуемом наборе. Эта операция неприменима, если установлен бит безопасности SECBIT_NO_CAP_AMBIENT_RAISE.
Мандат, указанный в arg3, удаляется из наружного набора.
Вызов prctl() возвращает 1, если мандат в arg3 присутствует в наружном наборе и 0, если нет.
Все мандаты будут удалены из наружного набора. Для этой операции требуется указать в arg3 значение 0.
Во всех перечисленных выше операциях значения arg4 и arg5 должны быть равны 0.
Возвращает 1 (как результат функции), если мандат, указанный в arg2, есть в списке мандатов вызывающей нити (capability bounding set), или 0, если нет. Константы мандатов определены в <linux/capability.h>. Значениями списка мандатов определяется, может ли процесс получить мандат через установку набора файловых прав при последующем вызове execve(2).
Если мандат, указанный в arg2, некорректен, то вызов завершится с ошибкой EINVAL.
Если вызывающая нить имеет мандат CAP_SETPCAP в своём пользовательском пространстве имён, то мандат, указанный в arg2, удаляется из списка мандатов вызывающей нити. Любой потомок вызывающей нити унаследует новый сокращённый список мандатов.
Вызов завершается с ошибками: EPERM, если вызывающая нить не имеет мандата CAP_SETPCAP; EINVAL, если в arg2 указан недопустимый мандат; EINVAL, если файловые мандаты не включены в ядре, в этом случае списки мандатов не поддерживаются.
Если значение arg2 не равно 0, то в вызвавшем процессе устанавливается атрибут «сборщика потомков» (child subreaper); если значение arg2 равно 0, то атрибут удаляется.
Сборщик потомков выполняет функцию init(1) для своих потомков. При завершении осиротевшего процесса (т. е. прямой предок уже завершил выполнение), его родителем станет ближайший действующий сборщик-предок. После этого вызов getppid() в осиротевшем процессе будет возвращать PID процесса-сборщика, и когда осиротевший процесс завершит работу, сборщик получит сигнал SIGCHLD и сможет запустить wait(2) для получения состояния завершения потомка.
The setting of this bit is not inherited by children created by fork(2) and clone(2). The setting is preserved across execve(2).
Назначение процесса-сборщика полезно в инфраструктуре управления сеансами, где иерархическая группа процессов управляется процессом-сборщиком, которому нужно сообщать, когда один из процессов — например, служба, выполнившая двойное создание (fork) — завершается (возможно для того, чтобы её можно было перезапустить). Некоторые инфраструктуры init(1) (например, systemd(1)) используют a процесс-сборщик для этих целей.
Возвращает значение атрибута «сборщика потомков» вызывающего в расположение, указанное (int *) arg2.
Установить состояние флага «дампа», определяющего создание файла 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).
Возвращает (как результат функции) текущее состояние флага дампа вызывающего процесса.
Устанавливает порядок байт вызывающего процесса равным значению arg2, которое может быть одним из: PR_ENDIAN_BIG, PR_ENDIAN_LITTLE или PR_ENDIAN_PPC_LITTLE (для PowerPC псевдо обратный порядок (pseudo little endian)).
Записывает значение порядка байт вызывающего процесса по адресу, указанному в (int *) arg2.
На архитектуре MIPS код пользовательского пространства можно собирать используя ABI, который позволяет компоновку с кодом, имеющем более ограничительные требования для плавающей запятой (FP). Например, код пользовательского пространства может собираться для цели O32 FPXX ABI и компоноваться с кодом, собранным с одним из более ограничительных FP32 или FP64 ABI. При этом требование всего процесса устанавливается в более ограничительный режим плавающей запятой.
Так как ядро не знает в каком режиме должен запускаться процесс и ограничения могут измениться во время работы процесса, создана операция PR_SET_FP_MODE, позволяющая контролировать режим плавающей запятой из пользовательского пространства.
В аргументе (unsigned int) arg2 указывается битовая маска, описывающая используемый режим плавающей запятой:
Если это бит сброшен (так называемый режим 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.
Включает эмуляцию 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_SET_FP_MODE).
При успешном выполнении возвращается битовая маска, представляющая текущий режим плавающей запятой.
Аргументы arg2, arg3, arg4 и arg5 игнорируются.
Устанавливает значение управляющих эмуляцией плавающей точки бит равным значению arg2. Для негласной (silently) эмуляции операций с плавающей точкой передайте PR_FPEMU_NOPRINT; при указании PR_FPEMU_SIGFPE операции с плавающей точкой не эмулируются, а посылается сигнал SIGFPE.
Записывает значение управляющих бит эмуляции плавающей точки по адресу, указанному в (int *) arg2.
Устанавливает режим исключений плавающей точки равным 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 включает режим исключения точности.
Записывает значение режима исключений плавающей точки по адресу, указанному в (int *) arg2.
Устанавливает флаг вызывающей нити «оставить мандаты». Этот флаг описан в capabilities(7). Значение arg2 должно быть или 0 (сбросить флаг) или 1 (установить флаг). Значение флага «оставить мандаты» будет сброшено в 0 при последующих вызовах execve(2).
Возвращает (как результат функции) текущее состояние флага «оставить мандаты» вызывающей нити. Описание флага смотрите в capabilities(7).
Устанавливает политику удаления (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() должны быть равны нулю для совместимости в будущем.
Возвращает значение политики удаления при машинной проверке для текущего процесса. Значения всех неиспользуемых аргументов prctl() должны быть равны нулю.
Изменяет определённые поля дескриптора карты памяти ядра вызывающего процесса. Обычно, значения этих полей задаются ядром или динамическим загрузчиком (подробней смотрите ld.so(8)), и обычные приложения не должны использовать эту возможность. Однако, есть случаи (самоизменяющиеся программы), где для программы может оказаться полезным изменение своей карты памяти.
Вызывающий процесс должен иметь мандат CAP_SYS_RESOURCE. Значения аргумента arg2 описаны далее, а в arg3 задаётся новое значение.Аргументы, arg4 и arg5, если не используются, должны быть равно нулю.
Since Linux 3.10, this feature is available all the time. Before Linux 3.10, this feature is available only if the kernel is built with the CONFIG_CHECKPOINT_RESTORE option enabled.
Устанавливает адрес памяти, выше которого располагается код программы, который может выполняться. Соответствующая область памяти должна быть доступна на чтение и выполнение, но не на запись или быть общедоступной (подробности смотрите в mprotect(2) и mmap(2)).
Устанавливает адрес памяти, ниже которого располагается код программы, который может выполняться. Соответствующая область памяти должна быть доступна на чтение и выполнение, но не на запись или быть общедоступной.
Устанавливает адрес памяти, выше которого располагаются инициализированные и не инициализированные (bss) данные. Соответствующая область памяти должна быть доступна на чтение и запись, но не на выполнение или быть в общем доступе.
Устанавливает адрес памяти, ниже которого располагаются инициализированные и не инициализированные (bss) данные. Соответствующая область памяти должна быть доступна на чтение и запись, но не на выполнение или быть в общем доступе.
Устанавливает начальный адрес стека. Соответствующая область памяти должна быть доступна на чтение и запись.
Устанавливает адрес памяти, выше которого можно расширять программную кучу с помощью вызова brk(2). Адрес должен быть больше конечного адреса текущего программного сегмента данных. Также, суммарный размер полученной кучи и сегмента данных не может превышать ограничитель ресурса RLIMIT_DATA (смотрите setrlimit(2)).
Устанавливает текущее значение 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, должен принадлежать области стека процесса. То есть, соответствующая память должна быть доступна на чтение, запись и (в зависимости от настройки ядра) у неё должен быть установлен атрибут MAP_GROWSDOWN (смотрите mmap(2)).
Задаёт новый вспомогательный вектор (auxiliary vector). В аргументе arg3 должен передаваться адрес вектора. В аргументе arg4 — размер вектора.
Заменяет символьную ссылку /proc/pid/exe новой, указывающей на новый исполняемый файл, задаваемый файловым дескриптором в аргументе arg3. Файловый дескриптор должен быть получен с помощью обычного вызова open(2).
Для изменения символьной ссылки необходимо отключить (unmap) все существующие исполняемые области памяти, включая созданные самим ядром (например, ядро, обычно, создаёт, как минимум, исполняемую область памяти для раздела ELF .text).
The second limitation is that such transitions can be done only once in a process life time. Any further attempts will be rejected. This should help system administrators monitor unusual symbolic-link transitions over all processes running on a system.

Начиная с Linux 3.18 доступны следующие параметры:

Предоставляет однократный доступ ко всем адресам, переданным в struct prctl_mm_map (определена в <linux/prctl.h>). В аргументе arg4 должен указываться размер структуры.
Эта возможность доступна только, если ядро собрано с параметром CONFIG_CHECKPOINT_RESTORE.
Возвращает размер struct prctl_mm_map, который ожидает ядро. Это позволяет пользователю подобрать совместимую структуру. Аргумент arg4 должен быть указателем на unsigned int.
Эта возможность доступна только, если ядро собрано с параметром CONFIG_CHECKPOINT_RESTORE.
Включает или выключает управление таблицами границ 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.
Назначает имя вызывающей нити, используя значение памяти, переданное в указателе (char *) arg2. Имя может быть не более 16, включая завершающий байт null (если длина строки, включая завершающий null, превышает 16 байт, то строка просто обрезается). Это то же атрибут, который можно установить через pthread_setname_np(3) и получить с помощью pthread_getname_np(3). Также этот атрибут доступен через /proc/self/task/[tid]/comm, где tid — имя вызывающей нити.
Записывает имя вызывающей нити в буфер, указанный в (char *) arg2. Буфер должен быть не более 16 байт; полученная строка будет завершаться null.
Set the calling thread's no_new_privs bit to the value in arg2. With no_new_privs set to 1, execve(2) promises not to grant privileges to do anything that could not have been done without the execve(2) call (for example, rendering the set-user-ID and set-group-ID mode bits, and file capabilities non-functional). Once set, this bit cannot be unset. The setting of this bit is inherited by children created by fork(2) and clone(2), and preserved across execve(2).
Since Linux 4.10, the value of a thread's no_new_privs bit can be viewed via the NoNewPrivs field in the /proc/[pid]/status file.
Дополнительную информацию смотрите в файле исходного кода ядра Documentation/userspace-api/no_new_privs.rst (или в Documentation/prctl/no_new_privstxt до Linux 4.13). Также смотрите seccomp(2).
Return (as the function result) the value of the no_new_privs bit for the calling thread. A value of 0 indicates the regular execve(2) behavior. A value of 1 indicates execve(2) will operate in the privilege-restricting mode described above.
Securely reset the thread's pointer authentication keys to fresh random values generated by the kernel.
The set of keys to be reset is specified by arg2, which must be a logical OR of zero or more of the following:
instruction authentication key A
instruction authentication key B
data authentication key A
data authentication key B
generic authentication “A” key.
(Yes folks, there really is no generic B key.)
As a special case, if arg2 is zero, then all the keys are reset. Since new keys could be added in future, this is the recommended way to completely wipe the existing keys when establishing a clean execution context. Note that there is no need to use PR_PAC_RESET_KEYS in preparation for calling execve(2), since execve(2) resets all the pointer authentication keys.
The remaining arguments arg3, arg4, and arg5 must all be zero.
If the arguments are invalid, and in particular if arg2 contains set bits that are unrecognized or that correspond to a key not available on this platform, then the call fails with error EINVAL.
Warning: Because the compiler or run-time environment may be using some or all of the keys, a successful may crash the calling process. The conditions for using it safely are complex and system-dependent. Don't use it unless you know what you are doing.
For more information, see the kernel source file Documentation/arm64/pointer-authentication.rst (or Documentation/arm64/pointer-authentication.txt before Linux 5.3). PR_PAC_RESET_KEYS may crash the calling process. The conditions for using it safely are complex and system-dependent. Don't use it unless you know what you are doing.
Set the parent death signal of the calling process to arg2 (either a signal value in the range 1..maxsig, or 0 to clear). This is the signal that the calling process will get when its parent dies. This value is cleared for the child of a fork(2) and (since Linux 2.4.36 / 2.6.23) when executing a set-user-ID or set-group-ID binary, or a binary that has associated capabilities (see capabilities(7)). This value is preserved across execve(2).
Предупреждение: «родителем» здесь считается нить, создавшая этот процесс. Иначе говоря, сигнал будет послан при завершении нити (например, с помощью pthread_exit(3)), а не всех нитей родительского процесса.
Записывает текущее значение сигнала о завершении работы родительского процесса по адресу, указанному в (int *) arg2.
Имеет смысл, только если включён 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).
Устанавливает режим безопасных вычислений (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).
Возвращает значение (как результат функции) режима безопасных вычислений вызвавшей нити. Если вызывающий не работает в режиме безопасных вычислений, то возвращается 0; если вызывающий находится в режиме ограниченных безопасных вычислений, то вызов prctl() приведёт к отправке процессу сигнала SIGKILL. Если вызывающий работает в режиме фильтрации и данный системный вызов разрешён в фильтрах seccomp, то возвращается 2; в противном случае процесс завершается по сигналу SIGKILL. Эта операция доступна только, если ядро собрано с параметром CONFIG_SECCOMP.
Начиная с Linux 3.8 в поле Seccomp файла /proc/[pid]/status предоставляется метод получения той же информации, без риска уничтожения процесса; смотрите proc(5).
Устанавливает значение флагов «securebits» вызывающей нити равным значению arg2. Смотрите capabilities(7).
Возвращает (как результат функции) флаги «securebits» вызывающей нити. Смотрите capabilities(7).
Задать состояние флага «THP disable» вызывающей нити. Если arg2 не равно нулю, то флаг устанавливается, иначе очищается. Установка этого флага предоставляет метод отключения прозрачных огромных страниц для заданий, код которых нельзя изменить и использование обработчика malloc с madvise(2) невозможно (т. е., место под данные выделено статически). Значение флага «THP disable» наследуется потомком, создаваемым fork(2) и сохраняется после execve(2).
Отключает все счётчики производительности, прикреплённые к вызывающему процессу, не учитывая, были ли они созданы этим процессом или каким-то другим. Счётчики производительности, созданные вызывающим процессом для других процессов, не отключаются. Подробности о счётчиках производительности приведены в файле ядра Linux tools/perf/design.txt.
Сначала назывался PR_TASK_PERF_COUNTERS_DISABLE; переименован (числовое значение не изменилось) в Linux 2.6.32.
Противоположное действие PR_TASK_PERF_EVENTS_DISABLE; включает счётчики производительности, прикреплённые к вызывающему процессу.
Сначала назывался PR_TASK_PERF_COUNTERS_ENABLE; переименован в Linux 2.6.32.
Возвращает текущее значение (как результат функции) флага «THP disable» вызывающей нити: 1 — флаг установлен; 0 — нет.
Возвращает адрес 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.
Each thread has two associated timer slack values: a "default" value, and a "current" value. This operation sets the "current" timer slack value for the calling thread. If the nanosecond value supplied in arg2 is greater than zero, then the "current" value is set to this value. If arg2 is less than or equal to zero, the "current" timer slack is reset to the thread's "default" timer slack value.
«Текущий» допуск таймера используется ядром для группировки таймерных окончаний при вызовах нити, которые происходят очень часто; как следствие, таймерные окончания нити могут быть равны до указанной наносекундной задержки (но никогда не будут истекать ранее). Группировка таймерных окончаний может помочь сократить потребление энергии системой, в следствии сокращения количества пробуждений ЦП.
Таймерные окончания, на которые влияет допуск таймера, устанавливаются 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)).
When a new thread is created, the two timer slack values are made the same as the "current" value of the creating thread. Thereafter, a thread can adjust its "current" timer slack value via PR_SET_TIMERSLACK. The "default" value can't be changed. The timer slack values of init (PID 1), the ancestor of all processes, are 50,000 nanoseconds (50 microseconds). The timer slack values are preserved across execve(2).
Начиная с Linux 4.6 значение «текущего» допуска таймера любого процесса можно получить и изменить через файл /proc/[pid]/timerslack_ns. Смотрите proc(5).
Возвращает значение «текущего» допуска (как результат функции) таймера вызывающей нити.
Включает использование обычного статистического временного режима выполнения процесса (process timing) или точного режима на основе меток времени (timestamp-based process timing), при передаче PR_TIMING_STATISTICAL или PR_TIMING_TIMESTAMP в arg2. Действия для PR_TIMING_TIMESTAMP пока не реализованы (попытка установить этот режим приведёт к ошибке EINVAL).
Возвращает (как результат функции) тип используемого в данный момент временного режима выполнения процесса.
Устанавливает состояние флага, определяющего может ли процесс прочитать счётчик метки времени (timestamp counter). Значение PR_TSC_ENABLE в arg2 разрешает чтение, PR_TSC_SIGSEGV включает генерацию SIGSEGV, если процесс пытается прочитать счётчик метки времени.
Записывает значение флага, определяющего может ли быть прочитан счётчик метки времени (timestamp counter), по адресу, указанному в (int *) arg2.
(только для: 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_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 устанавливается в соответствующее значение.

ОШИБКИ

Значение option равно PR_SET_SECCOMP и arg2 равно SECCOMP_MODE_FILTER, но процесс не имеет мандата CAP_SYS_ADMIN или установленного атрибута no_new_privs (смотрите обсуждение PR_SET_NO_NEW_PRIVS выше).
Значение option равно PR_SET_MM, а arg3PR_SET_MM_EXE_FILE, файл не является исполняемым.
Значение option равно PR_SET_MM, arg3PR_SET_MM_EXE_FILE, и файловый дескриптор, переданный в arg4, некорректен.
Значение option равно PR_SET_MM, arg3PR_SET_MM_EXE_FILE, и это вторая попытка изменить символьную ссылку /proc/pid/exe, что запрещено.
В arg2 указан неправильный адрес.
Значение option равно PR_SET_SECCOMP, arg2 равно SECCOMP_MODE_FILTER, система была собрана с CONFIG_SECCOMP_FILTER и arg3 содержит некорректный адрес.
Не распознано значение option.
Значение option равно PR_MCE_KILL, PR_MCE_KILL_GET или PR_SET_MM, и неиспользуемые аргументы prctl() не равны нулю.
Неверное значение arg2 для указанной в option операции.
Значение option равно PR_SET_SECCOMP или PR_GET_SECCOMP, и ядро не собрано с параметром CONFIG_SECCOMP.
Значение option равно PR_SET_SECCOMP, arg2 равно SECCOMP_MODE_FILTER и ядро было собрано без CONFIG_SECCOMP_FILTER.
Значение 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.
Значение option равно PR_SET_PTRACER и значение arg2 не равно 0, PR_SET_PTRACER_ANY или PID существующего процесса.
Значение option равно PR_SET_PDEATHSIG и значение arg2 не является корректным номером сигнала.
Значение option равно PR_SET_DUMPABLE и значение arg2 не равно SUID_DUMP_DISABLE или SUID_DUMP_USER.
Значение option равно PR_SET_TIMING и значение arg2 не равно PR_TIMING_STATISTICAL.
Значение option равно PR_SET_NO_NEW_PRIVS и значение arg2 не равно 1 или arg3, arg4 или arg5 не равны нулю.
Значение option равно PR_GET_NO_NEW_PRIVS и значения arg2, arg3, arg4 или arg5 не равны нулю.
Значение option равно PR_SET_THP_DISABLE и arg3, arg4 или arg5 не равны нулю.
Значение option равно PR_GET_THP_DISABLE и значения arg2, arg3, arg4 или arg5 не равны нулю.
option is PR_CAP_AMBIENT and an unused argument (arg4, arg5, or, in the case of PR_CAP_AMBIENT_CLEAR_ALL, arg3) is nonzero; or arg2 has an invalid value; or arg2 is PR_CAP_AMBIENT_LOWER, PR_CAP_AMBIENT_RAISE, or PR_CAP_AMBIENT_IS_SET and arg3 does not specify a valid capability. EINVAL option is PR_PAC_RESET_KEYS and the arguments are invalid or unsupported. See the description of PR_PAC_RESET_KEYS above for details.
Значение option было PR_MPX_ENABLE_MANAGEMENT или PR_MPX_DISABLE_MANAGEMENT и ядро или ЦП не поддерживают управление MPX. Проверьте, что ядро и процессор поддерживают MPX.
Значение option равно PR_SET_FP_MODE и arg2 содержит неправильное или неподдерживаемое значение.
Значение option равно PR_SET_SECUREBITS, и вызывающий не имеет мандата CAP_SETPCAP, или пытается сбросить «заблокированный» флаг, или пытается установить флаг, для которого установлен соответствующий заблокированный флаг (смотрите capabilities(7)).
Значение option равно PR_SET_KEEPCAPS, и у вызывающего установлен флаг SECBIT_KEEP_CAPS_LOCKED (смотрите capabilities(7)).
Значение option равно PR_CAPBSET_DROP, и вызывающий не имеет мандата CAP_SETPCAP.
Значение option равно PR_SET_MM, и вызывающий не имеет мандата CAP_SYS_RESOURCE.
Значение 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);

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

СМ. ТАКЖЕ

signal(2), core(5)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 4.16. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Kogan, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

2 февраля 2018 г. Linux