getpriority(2)

NAZWA
getpriority, setpriority - pobiera/ustawia priorytet programu podczas szeregowania zadań

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <sys/resource.h>

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

OPIS
Priorytet procesu, grupy procesów, lub użytkownika podczas szeregowania zadań, wskazywany przez which i who jest uzyskiwany za pomocą wywołania getpriority(), a ustawiany za pomocą wywołania setpriority. Atrybut procesu, na którym działają niniejsze wywołania systemu jest tym samym atrybutem (znanym również jako wartość „nice”), na którym działa nice(2).

Wartość which jest jedną z: PRIO_PROCESS, PRIO_PGRP lub PRIO_USER, a who jest interpretowane względem which (identyfikator procesu dla PRIO_PROCESS, identyfikator grupy procesów dla PRIO_PGRP i identyfikator użytkownika dla PRIO_USER). Zerowa wartość who określa (odpowiednio) proces wywołujący, grupę procesów procesu wywołującego lub rzeczywisty identyfikator użytkownika procesu wywołującego.

prio jest wartością z zakresu od -20 do 19 (lecz zob. UWAGI poniżej), gdzie -20 jest najwyższym priorytetem, a 19 jest najniższym priorytetem. Próby ustawienia priorytetu spoza tego przedziału, są po cichu ograniczane do obowiązującego przedziału. Domyślnym priorytetem jest 0; mniejsze wartości dają procesowy wyższy priorytet podczas szeregowania zadań.

Wywołanie getpriority() zwraca najwyższy priorytet (najniższą wartość numeryczną), spośród posiadanych przez którykolwiek z podanych procesów. Wywołanie setpriority() ustawia priorytety wszystkich podanych procesów na wskazaną wartość.

Tradycyjnie, jedynie proces uprzywilejowany mógł zmniejszyć wartość nice (tj. ustawić wyższy priorytet). Jednakże od Linuksa 2.6.12, proces nieuprzywilejowany może zmniejszyć wartość nice procesu docelowego, mającego odpowiedni miękki limit RLIMIT_NICE; więcej szczegółów w podręczniku getrlimit(2).

WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu getpriority() zwraca wartość nice wywołującego wątku, która może być liczbą ujemną. Po błędzie zwraca -1 i ustawia errno wskazując błąd.

Ze względu na fakt, że pomyślne wywołanie do getpriority() może zwrócić poprawną wartość -1, konieczne jest wyczyszczenie errno przed wywołaniem, a następnie sprawdzenie errno po nim, aby określić czy wartość -1 jest błędem, czy poprawną wartością nice.

setpriority() zwraca 0 po pomyślnym zakończeniu. W przypadku błędu zwraca -1 i ustawia errno wskazując jego rodzaj.

BŁĘDY

EACCES
    Wywołujący próbował obniżyć wartość nice (tj. ustawić wyższy priorytet procesu), ale nie posiadał odpowiednich przywilejów (na Linuksie: nie posiadał przywileju (ang. capability) CAP_SYS_NICE).

EINVAL
    which nie był jednym z PRIO_PROCESS, PRIO_PGRP lub PRIO_USER.

EPERM
    Proces został zlokalizowany, ale jego efektywny identyfikator użytkownika nie pasował ani do efektywnego, ani do rzeczywistego identyfikatora użytkownika wywołującego i nie był on uprzywilejowany (na Linuksie: nie posiadał przywileju CAP_SYS_NICE). Zob. jednakże HISTORIA poniżej.

ESRCH
    Nie zlokalizowano żadnego procesu przy użyciu podanych wartości which i who.

STANDARDY
POSIX.1-2024.

HISTORIA
4.2BSD, SVr4, SUSv1, POSIX.1-2001 XSI.

Szczegółowe warunki wystąpienia błędu EPERM zależą od systemu. Powyżej opisano co mówi na ten temat POSIX.1-2001, z którym wydają się być zgodne wszystkie systemy typu System V. Jądra Linux przed Linuksem 2.6.12 wymagały, aby rzeczywisty lub efektywny ID użytkownika wywołującego zgadzał się z rzeczywistym użytkownikiem procesu who (zamiast z jego efektywnym ID użytkownika). Linux 2.6.12 i późniejsze wymaga, aby efektywny identyfikator użytkownika wywołującego zgadzał się z rzeczywistym lub efektywnym ID użytkownika procesu who. Wszystkie systemy typu BSD (SunOS 4.1.3, Ultrix 4.2, 4.3BSD, FreeBSD 4.3, OpenBSD-2.5, ...) zachowują się w ten sam sposób jak Linux 2.6.12 i późniejsze.

UWAGI
Więcej informacji o wartości nice opisano w podręczniku sched(7).

Uwaga: w związku z dodaniem funkcjonalności „autogroup” w Linuksie 2.6.38, wartość nice w wielu przypadkach nie zachowuje się w swój tradycyjny sposób. Więcej informacji w podręczniku sched(7).

Proces potomny utworzony za pomocą fork(2) dziedziczy wartość nice swojego procesu macierzystego. Wartość nice jest zachowywana przez execve(2).

  Różnice biblioteki C/jądra
Wywołanie systemowe getpriority zwraca wartości nice przetłumaczone na zakres 40..1, ponieważ wartość negatywna zostałaby zinterpretowana jako błąd. Funkcja opakowująca glibc dla getpriority() tłumaczy tą wartość z powrotem, zgodnie z wzorem unice = 20 - knice (zatem zakres 40..1 zwracany przez jądro powraca do zakresu -20..19 widzianego przez przestrzeń użytkownika).

USTERKI
Zgodnie z POSIX, wartość nice jest ustawieniem przypisanym procesowi. Jednak w aktualnej implementacji Linuksa/NPTL wątków POSIX, wartość nice jest atrybutem przypisanym wątkowi: różne wątki tego samego procesu mogą mieć różne wartości nice. Przenośne aplikacje powinny unikać polegania na zachowaniu Linuksa, które może w przyszłości ulec zmianie na zgodne ze standardami.

ZOBACZ TAKŻE
nice(1), renice(1), fork(2), capabilities(7), sched(7)

Documentation/scheduler/sched-nice-design.rst w drzewie źródeł jądra Linux (od Linuksa 2.6.23)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.