ИМЯ 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 устанавливается в соответствующее значение.
ОШИБКИ EINVAL Значение which не равно PRIO_PROCESS, PRIO_PGRP или PRIO_USER.
ESRCH Не найдено процессов, которые заданы значениями which и who.
В дополнение к вышеуказанным ошибкам, setpriority() может завершиться неудачно:
EACCES Вызывающий пытается понизить значение уступчивости (то есть повысить приоритет процесса), но он не имеет на это прав (в Linux: не имеет мандата CAP_SYS_NICE).
Дополнительную информацию о значении уступчивости смотрите в 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)
|