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

ИМЯ

getpriority, setpriority - получить/установить приоритет планирования программы

ОБЗОР

#include <sys/time.h> #include <sys/resource.h>

int getpriority(int which, id_t who); int setpriority(int which, id_t who, int prio);

ОПИСАНИЕ

С помощью вызова getpriority() можно получить приоритет планирования (scheduling priority) процесса, группы процессов или пользователя, которые заданы в аргументах which и who, а с помощью вызова setpriority() назначить его. Атрибут процесса этих системных вызовов тот же самый что атрибут (так называемое значение уступчивости «nice»), с которым работает вызов nice(2).

Значением which может быть одно из: PRIO_PROCESS, PRIO_PGRP или PRIO_USER, а значение who рассматривается относительно which (идентификатор процесса, если PRIO_PROCESS; группы процесса, если PRIO_PGRP; идентификатор пользователя, если PRIO_USER). Нулевое значение who означает (соответственно) вызывающий процесс, группу вызывающего процесса или реальный идентификатор пользователя вызывающего процесса.

Аргумент prio — это значение в диапазоне от -20 до 19 (смотрите ЗАМЕЧАНИЯ ниже), где -20 это наивысший приоритет, а 19 — наинизший. Попытка задать приоритет вне этого диапазона просто подгоняется под диапазон. По умолчанию приоритет равен 0; низкие значения дают процессу больший приоритет при планировании.

Вызов getpriority() возвращает наивысший приоритет (наименьшее числовое значение) из приоритетов всех указанных процессов. Вызов setpriority() устанавливает приоритеты всех указанных процессов в заданное значение.

Обычно, только привилегированный процесс может понижать значение уступчивости (т. е., повышать приоритет). Однако начиная с Linux 2.6.12 непривилегированный процесс может понизить значение уступчивости процесса назначения, у которого установлено подходящее мягкое ограничение RLIMIT_NICE; подробности смотрите в getrlimit(2).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении getpriority() возвращает значение уступчивости вызывающей нити, которое может быть отрицательным. При ошибке возвращается -1 и изменяется значение errno, указывающее код ошибки. Так как getpriority() в качестве результата может вернуть -1, то перед вызовом необходимо очищать значение внешней переменной errno, а затем проверять его после вызова, чтобы определить, является ли -1 ошибкой или результатом вызова.

При нормальном завершении работы setpriority() возвращает 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

Значение which не равно PRIO_PROCESS, PRIO_PGRP или PRIO_USER.
Не найдено процессов, которые заданы значениями which и who.

В дополнение к вышеуказанным ошибкам, setpriority() может завершиться неудачно:

Вызывающий пытается понизить значение уступчивости (то есть повысить приоритет процесса), но он не имеет на это прав (в Linux: не имеет мандата CAP_SYS_NICE).
Процесс был найден, но эффективному идентификатору пользователя этого процесса не соответствует заданный в вызове эффективный (или реальный) идентификатор вызывающего и у вызывающего нет прав (в Linux: не имеет мандата CAP_SYS_NICE). Смотрите ЗАМЕЧАНИЯ далее.

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (эти интерфейсы впервые появились в 4.2BSD).

ЗАМЕЧАНИЯ

Дополнительную информацию о значении уступчивости смотрите в sched(7).

Замечание: дополнительное свойство «autogroup» из Linux 2.6.38 означает, что значение уступчивости во многих случаях больше не работает как обычно. Подробней смотрите в sched(7).

Потомок, созданный с помощью fork(2), наследует значение nice родителя. При вызове execve(2) значение nice сохраняется.

Детали условия возникновения ошибки EPERM зависят от системы. Описание, приведённое выше, соответствует POSIX.1-2001, и, кажется, ему удовлетворяют все System V-подобные системы. Ядра Linux до версии 2.6.12 требуют, чтобы эффективный идентификатор пользователя вызывающего совпадал с реальным идентификатором пользователя процесса who (вместо его эффективного идентификатора пользователя). В Linux 2.6.12 и новее требуется, чтобы эффективный идентификатор пользователя вызывающего совпадал с реальным или эффективным идентификатором пользователя процесса who. Все системы BSD (SunOS 4.1.3, Ultrix 4.2, 4.3BSD, FreeBSD 4.3, OpenBSD-2.5, …) действуют также как Linux 2.6.12 и новее.

Включать <sys/time.h> в настоящее время не требуется, но это увеличивает переносимость (безусловно, в <sys/resource.h> определена структура rusage с полями типа struct timeval, которая определена в <sys/time.h>).

Отличия между библиотекой C и ядром

Внутри ядра значения nice на самом деле представлены как диапазон (так как отрицательными числами задаются коды ошибок) и эти значения возвращаются системными вызовами setpriority() и getpriority(). Обёрточные функции glibc для этих системных вызовов преобразуют значение между пользовательским и ядерным диапазонами по формуле unice = 20 - knice (таким образом, ядерный диапазон 40..1 соответствует диапазону -20..19, видимый в пользовательском пространстве).

ДЕФЕКТЫ

Согласно POSIX, значение nice — свойство процесса. Однако в текущей реализации Linux/NPTL нитей POSIX значение nice — атрибут нити: различные нити в одном процессе могут иметь разные значения nice. Переносимые приложения не должны полагаться на поведение Linux, которое может стать стандартом в будущем.

СМОТРИТЕ ТАКЖЕ

nice(1), renice(1), fork(2), capabilities(7), sched(7)

Файл Documentation/scheduler/sched-nice-design.txt из дерева исходного кода ядра Linux (начиная с Linux 2.6.23)

2017-09-15 Linux