Главная » 2017 » Ноябрь » 24 » man 2 setpriority
05:10
man 2 setpriority

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


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)



Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 377 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar