[ Pobierz całość w formacie PDF ]
przekazywana przez sp nie ma sensu dla danej strategii (tylko dla sched_setscheduler()).
EPERM
Proces wywo uj cy nie posiada odpowiednich uprawnie .
ESRCH
Warto przekazana w pid nie odzwierciedla adnego istniej cego procesu.
Ustawianie parametrów szeregowania
Funkcje systemowe sched_getparam() oraz sched_setparam(), zdefiniowane przez POSIX,
odczytuj oraz ustawiaj parametry zwi zane z ustalon ju strategi szeregowania:
#include
struct sched_param
{
/* & */
int sched_priority;
/* & */
};
int sched_getparam (pid_t pid, struct sched_param *sp);
int sched_setparam (pid_t pid, const struct sched_param *sp);
Systemy czasu rzeczywistego 211
Kup książkę Poleć książkę
Funkcja sched_getscheduler() zwraca wy cznie strategi szeregowania, natomiast nie zwraca
zwi zanych z ni parametrów. Wywo anie sched_getparam() dla procesu okre lonego w parame-
trze pid zwraca parametry szeregowania w zmiennej sp:
struct sched_param sp;
int ret;
ret = sched_getparam (0, &sp);
if (ret == -1)
{
perror ("sched_getparam");
return 1;
}
printf ("Nasz priorytet wynosi %d\n", sp.sched_priority);
Je li pid wynosi 0, funkcja podaje parametry dla procesu wywo uj cego. W przypadku sukcesu
funkcja zwraca 0, w przypadku niepowodzenia zwraca 1 oraz odpowiednio ustawia errno.
Poniewa sched_setscheduler() równie ustawia parametry szeregowania, sched_setparam()
jest u yteczna tylko w celu pó niejszych modyfikacji tych parametrów:
struct sched_param sp;
int ret;
sp.sched_priority = 1;
ret = sched_setparam (0, &sp);
if (ret == -1)
{
perror ("sched_setparam");
return 1;
}
W przypadku sukcesu parametry szeregowania dla procesu pid s ustawiane poprzez zmienn
sp, a funkcja zwraca 0. W przypadku niepowodzenia funkcja zwraca 1 oraz odpowiednio
ustawia errno.
Po uruchomieniu tych dwóch fragmentów kodu otrzyma si nast puj cy wynik:
Nasz priorytet wynosi 1
Przyk ad ten tak e jest oparty na za o eniu, e 1 okre la prawid ow warto priorytetu. Tak
przewa nie jest, lecz podczas tworzenia programów przeno nych nale y to wcze niej sprawdzi .
Za chwil zostanie pokazane, jak ustala zakres poprawnych priorytetów.
Kody b dów
W przypadku b du mo liwe s cztery warto ci errno:
EFAULT
Zmienna wska nikowa sp wskazuje na b dny lub niedost pny obszar pami ci.
EINVAL
Warto przekazana przez sp nie ma sensu dla danej strategii (tylko sched_getparam()).
EPERM
Proces wywo uj cy nie posiada niezb dnych uprawnie .
ESRCH
Warto przekazana w pid nie odpowiada adnemu istniej cemu procesowi.
212 Rozdzia 6. Zaawansowane zarz dzanie procesami
Kup książkę Poleć książkę
Okre lanie zakresu poprawnych priorytetów
Poprzednie przyk ady kodów przekazywa y sztywno ustalone warto ci priorytetów do odpo-
wiednich funkcji systemowych. POSIX nie gwarantuje, e dane warto ci priorytetów szere-
gowania istniej w okre lonym systemie, z wyj tkiem tego, e musz istnie przynajmniej 32
ró ne priorytety pomi dzy najni sz a najwy sz warto ci . Jak wspomniano ju wcze niej
w punkcie Linuksowe strategie szeregowania i ustalania priorytetów , Linux przypisuje za-
kres warto ci od 1 do 99 w cznie dla dwóch strategii czasu rzeczywistego. Poprawny i przeno-
ny program zwykle definiuje swój w asny obszar warto ci priorytetów i mapuje je w odpo-
wiedni zakres, w a ciwy dla systemu operacyjnego. Na przyk ad, je li zaistnieje potrzeba
uruchomienia procesów o czterech ró nych poziomach priorytetów czasu rzeczywistego, mo na
dynamicznie okre li zakres priorytetów i wybra cztery konkretne warto ci.
Linux udost pnia dwie funkcje systemowe dla odczytu zakresu poprawnych warto ci priory-
tetów. Jedna z nich zwraca warto minimaln , a druga maksymaln :
#include
int sched_get_priority_min (int policy);
int sched_get_priority_max (int policy);
W przypadku sukcesu wywo anie funkcji sched_get_priority_min() zwraca warto mini-
maln , natomiast wywo anie sched_get_priority_max() zwraca maksymalny poprawny prio-
rytet powi zany ze strategi szeregowania, przekazan w parametrze policy. W przypadku
niepowodzenia obie funkcje zwracaj 1. Jedyny mo liwy b d, jaki mo e wyst pi , dotyczy
b dnego parametru policy wówczas errno ustawiane jest na EINVAL.
U ycie funkcji jest proste:
int min, max;
min = sched_get_priority_min (SCHED_RR);
if (min == -1)
{
perror ("sched_get_priority_min");
return 1;
}
max = sched_get_priority_max (SCHED_RR);
if (max == -1)
{
perror ("sched_get_priority_max");
return 1;
}
printf ("Zakres warto ci priorytetów dla strategii SCHED_RR wynosi: %d - %d\n", min,
max);
[ Pobierz całość w formacie PDF ]