int getpriority(int which, int who); int setpriority(int which, int who, int prio);
ОПИСАНИЕ
Вызовом
getpriority
можно получить и вызовом
setpriority
можно установить приоритет планировщика для процесса, группы процесса или
пользователя в зависимости от заданных значений
which
и
who.
Which
может принимать одно из значений
PRIO_PROCESS,
PRIO_PGRP,
или
PRIO_USER,
а
who
интерпретируется в зависимости от
which
(идентификатор процесса для
PRIO_PROCESS,
группы процесса для
PRIO_PGRP,
и идентификатор пользователя для
PRIO_USER).
Нулевое значение для
who
означает (соответственно) вызывающий процесс, группу
вызывающего процесса или реальный идентификатор пользователя
вызывающего процесса.
Prio
- это значение в диапазоне от -20 до 20 (см. замечания ниже).
По умолчанию приоритет равен 0;
более низкие значения соответствуют большему приоритету,
который уделяет задаче планировщик.
Вызов
getpriority
возвращает наивысший приоритет (наименьшее числовое значение),
из приоритетов всех указанных процессов. Вызов
setpriority
устанавливает приоритеты всех указанных процессов в заданное
значение. Только суперпользователь может устанавливать приоритет
ниже нуля.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Поскольку
getpriority
может возвращать значение -1 как один из правильных результатов,
необходимо очищать значение переменной
errno
перед этим вызовом и затем проверять его снова после вызова,
чтобы определить, является ли -1 ошибкой или результатом вызова.
Вызов
setpriority
возвращает 0, если прошёл успешно или -1, если завершился с ошибкой.
ОШИБКИ
ESRCH
Не найдено процессов, которые заданы значениями
which
и
who.
EINVAL
Which
не является одним из значений
PRIO_PROCESS,
PRIO_PGRP,
или
PRIO_USER.
В дополнение к вышеуказанным ошибкам,
setpriority
может завершиться неудачно, если:
EPERM
Процесс был найден, но эффективному идентификатору пользователя
этого процесса не соответствует заданный в вызове эффективный (или
реальный) идентификатор пользователя.
EACCES
Не-суперпользователь пытается назначить приоритет ниже нуля.
ЗАМЕЧАНИЯ
Детали условия возникновения ошибки EPERM зависят от системы.
Ниже дано описание, что по этому поводу говорит стандарт SUSv3 и
далее что происходит на системах стандрта SYSV.
Linux требует, чтобы реальный или эффективный идентификатор
пользователя, производящего вызов совпадали с реальным идентификатором
пользователя для процесса, указанного в who (вместо
эффективного идентификатора пользователя).
Все BSD системы (SunOS 4.1.3, Ultrix 4.2,
BSD 4.3, FreeBSD 4.3, OpenBSD-2.5, ...) требуют чтобы эффективный
идентификатор пользователя, производящего вызов совпадал с
реальным или эффективным идентифкатором пользователя для процесса,
указанного в who.
Фактический диапазон значений приоритета варьируется в зависимости
от версий ядра. Linux до 1.3.36 имел диапазон значений -infinity..15.
Linux начиная с 1.3.43 имеет диапазон значений -20..19 и
системный вызов getpriority возвращает для этих значений величины
40..1 (отрицательные числа показывают код ошибки).
Библиотечный вызов преобразует возвращаемое значение N в значение
20-N.
Включение заголовочного файла
<sys/time.h>
в настоящее время не требуется, но увеличивает переносимость,
написанной программы.
(В реальности,
<sys/resource.h>
определяет структуру
rusage
с полями типа
structtimeval,
которая определяется в
<sys/time.h>.)
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, 4.4BSD (эти вызовы впервые появились в 4.2BSD).