- bullseye-backports 4.18.1-1~bpo11+1
- testing 4.18.1-1
- unstable 4.18.1-1
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).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
On success, getpriority() returns the calling thread's nice value, which may be a negative number. On error, it returns -1 and sets errno to indicate the cause of the error.
Since a successful call to getpriority() can legitimately return the value -1, it is necessary to clear the external variable errno prior to the call, then check errno afterward to determine if -1 is an error or a legitimate value.
При нормальном завершении работы setpriority() возвращает 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ¶
- EINVAL
- Значение which не равно PRIO_PROCESS, PRIO_PGRP или PRIO_USER.
- ESRCH
- Не найдено процессов, которые заданы значениями which и who.
В дополнение к вышеуказанным ошибкам, setpriority() может завершиться неудачно:
- EACCES
- Вызывающий пытается понизить значение уступчивости (то есть повысить приоритет процесса), но он не имеет на это прав (в Linux: не имеет мандата CAP_SYS_NICE).
- EPERM
- Процесс был найден, но эффективному идентификатору пользователя этого процесса не соответствует заданный в вызове эффективный (или реальный) идентификатор вызывающего и у вызывающего нет прав (в 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)
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 сентября 2017 г. | Linux |