table of contents
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>, значения остальных аргументов зависят от указываемого типа. Первый аргумент может принимать следующие значения:
- 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_DUMPABLE (начиная с Linux 2.3.20)
- Устанавливает флаг, определяющий, будет ли создан файл core для этого процесса после доставки сигнала, при появлении которого по умолчанию создаётся файл core. Обычно, этот флаг устанавливается для процесса по умолчанию, но он очищается выполнении программ с set-UID или set-GID битами, а также разными системными вызовами, изменяющими идентификаторы UID и GID. В ядрах до версии 2.6.12 включительно значение arg2 должно быть или 0 (для процесса невозможен дамп) или 1 (для процесс возможен дамп). В ядрах с версии 2.6.13 до 2.6.17 допустимо также значение 2, которое означает, что для любого исполняемого файла, для которого обычно дамп невозможен, будет выполняться дамп, доступный на чтение только root; для повышения безопасности эта возможность была удалена (смотрите также описание /proc/sys/fs/suid_dumpable в proc(5)). К процессам, для которых сделать дамп невозможно, с помощью ptrace(2) PTRACE_ATTACH подключиться нельзя.
- 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_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)
- Устанавливает флаг нити «оставить мандаты», который определяет, будет ли список разрешённых мандатов нити очищен при изменении пользовательского идентификатора нити таким образом, что сохранённый, действующий и действительный идентификаторы станут ненулевыми, если при этом хотя бы один из них ранее был равен нулю. По умолчанию, список разрешённых мандатов очищается, когда происходит такое изменение; установка флага «оставить мандаты» отменяет очистку. Значение arg2 должно быть или 0 (мандаты очищаются) или 1 (мандаты сохраняются). (Эффективный список мандатов всегда очищается при таких изменениях данных, независимо от значения флага «оставить мандаты».) Значение флага «оставить мандаты» будет сброшено в 0 при последующих вызовах execve(2).
- PR_GET_KEEPCAPS (начиная с Linux 2.2.18)
- Возвращает (как результат функции) текущее состояние флага «оставить мандаты» вызывающего процесса.
- PR_SET_NAME (начиная с Linux 2.6.9)
- Устанавливает имя вызывающего процесса, используя значение, на которое указывает (char *) arg2. Длина имени может быть до 16 байт и имя должно завершаться null, если содержит меньшее количество байт.
- PR_GET_NAME (начиная с Linux 2.6.11)
- Записывает имя вызывающего процесса в буфер, указанный в (char *) arg2. Буфер должен быть не менее 16 байт; полученная строка будет завершаться null, если она короче данного размера.
- PR_SET_PDEATHSIG (начиная с Linux 2.1.57)
- Устанавливает значение сигнала, приходящего процессу при завершении работы родительского процесса, равным arg2 (это значение может быть от 1..maxsig или 0 для снятия). Этот сигнал получит вызывающий процесс, когда его родитель завершится. Это значение очищается у потомка при выполнении fork(2) и (начиная с Linux 2.5.36 / 2.6.23), если выполняется файл с установленным битом set-user_ID или set-group-ID.
- PR_GET_PDEATHSIG (начиная с Linux 2.3.15)
- Записывает текущее значение сигнала о завершении работы родительского процесса по адресу, указанному в (int *) arg2.
- PR_SET_SECCOMP (начиная с Linux 2.6.23)
- Включает безопасный режим вычислений в вызывающей нити. В имеющейся реализации значение arg2 должно быть равно 1. После установки безопасного режима вычислений в 1, в нити разрешено выполнять только системные вызовы read(2), write(2), _exit(2) и sigreturn(2). При запуске других системных вызовов генерируется сигнал SIGKILL. Безопасный режим вычислений полезен для вычислительных приложений, которым может потребоваться выполнить недоверительный байт-код, возможно полученный при чтении из канала или сокета. Эта операция доступна только, если в ядре включён параметр CONFIG_SECCOMP.
- PR_GET_SECCOMP (начиная с Linux 2.6.23)
- Возвращает значение режима безопасных вычислений вызывающей нити. Не очень полезна в имеющейся реализации (значение режима всегда равно 1), но может быть полезна в будущем: если вызывающий находится не в режиме безопасных вычислений, то возвращается 0; если вызывающий находится в режиме безопасных вычислений, то вызов prctl() приведёт к отправке процессу сигнала SIGKILL. Эта операция доступна только, если в ядре включён параметр CONFIG_SECCOMP.
- PR_SET_SECUREBITS (начиная с Linux 2.6.26)
- Устанавливает значение флагов «securebits» вызывающей нити равным значению arg2. Смотрите capabilities(7).
- PR_GET_SECUREBITS (начиная с Linux 2.6.26)
- Возвращает (как результат функции) флаги «securebits» вызывающей нити. Смотрите capabilities(7).
- 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_TASK_PERF_EVENTS_DISABLE (начиная с Linux 2.6.31)
- Отключает все счётчики производительности, прикреплённые к вызывающему процессу, не учитывая, были ли они созданы этим процессом или каким-то другим. Счётчики производительности, созданные вызывающим процессом для других процессов, не отключаются. Подробности о счётчиках производительности приведены в файле ядра 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_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) Устанавливает значение битов контроля доступа выравнивания равным значению arg2. При значении PR_UNALIGN_NOPRINT пользовательский доступ без выравнивания негласно (silently) исправляется, а при PR_UNALIGN_SIGBUS генерируется сигнал SIGBUS.
- PR_GET_UNALIGN
- (информацию о версиях и архитектурах смотрите в PR_SET_UNALIGN) Записывает значение битов контроля доступа выравнивания по адресу, указанному в (int *) arg2.
- 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)), и обычные приложения не должны использовать эту возможность. Однако, есть случаи (самоизменяющиеся программы), где для программы может оказаться полезным изменение своей карты памяти. Данная возможность доступна только, если ядро собрано с параметром CONFIG_CHECKPOINT_RESTORE. Вызывающий процесс должен иметь мандат CAP_SYS_RESOURCE. Значения аргумента arg2 описаны далее, а в arg3 задаётся новое значение.
- 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.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении для операций PR_GET_DUMPABLE, PR_GET_KEEPCAPS, PR_CAPBSET_READ, PR_GET_TIMING, PR_GET_SECUREBITS, PR_MCE_KILL_GET и (если возвращается) PR_GET_SECCOMP возвращаются неотрицательные значения, описанные ранее. При успешном выполнении для остальных значений option возвращается 0. При ошибке возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ¶
- EFAULT
- В arg2 указан неправильный адрес.
- EINVAL
- Нераспознанно значение option.
- EINVAL
- Значение option равно PR_MCE_KILL, PR_MCE_KILL_GET или PR_SET_MM, и неиспользуемые аргументы prctl() не равны нулю.
- EINVAL
- Неверное значение arg2 для указанной в option операции.
- EINVAL
- Значение option равно PR_SET_SECCOMP или PR_SET_SECCOMP, но в ядре не собрано с параметром CONFIG_SECCOMP.
- 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.
- EPERM
- Значение option равно PR_SET_SECUREBITS, и вызывающий не имеет мандата CAP_SETPCAP, или пытается сбросить «заблокированный» флаг, или пытается установить флаг, для которого установлен соответствующий заблокированный флаг (смотрите capabilities(7)).
- EPERM
- Значение option равно PR_SET_KEEPCAPS, и у вызывающего установлен флаг SECURE_KEEP_CAPS_LOCKED (смотрите capabilities(7)).
- EPERM
- Значение option равно PR_CAPBSET_DROP, и вызывающий не имеет мандата CAP_SETPCAP.
- EPERM
- Значение option равно PR_SET_MM, и вызывающий не имеет мандата CAP_SYS_RESOURCE.
ВЕРСИИ¶
Системный вызов prctl() впервые появился в Linux 2.1.57.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
Данный вызов существует только в Linux. В IRIX есть системный вызов prctl() (также представленный в Linux 2.1.44 как irix_prctl на архитектуре MIPS) объявленный как
ptrdiff_t prctl(int option, int arg2, int arg3);
а также операции, позволяющие получить максимальное количество процессов для каждого пользователя, максимальное количество процессоров, которое может использовать вызывающий процесс; определить, блокирован ли заданный процесс; получить или установить максимальный размер стека и т. д.
СМОТРИТЕ ТАКЖЕ¶
2012-04-23 | Linux |