104
Funkcja stuży do sterowania semaforami i ma następujące parametry:
• semid - numer zbioru semaforów,
• sem_num - numer semafora w zbiorze (numeracja zaczyna sie od zera),
• command - polecenie, jakie ma być wykonane na zbiorze semaforów,
• ctl_arg - parametry polecenia.
Funkcja semctl należy do trzech kategorii standardowych funkcji EPC:
Tabela 9.2
Kategorie standardowych funkcji IPC
Standardowe funkcje IPC (struktura semió_ds zdefiniowana jest w <sys/sem.h>) | |
IPC_STAT |
umieszcza informację o stanie w ctl_arg. stat |
IPC_SET |
ustawia informację o prawach własności i dostępu z ctl_arg. stat |
IPC_RtyiID |
usuwa zestaw semaforów z systemu |
Operacje na pojedynczym semaforze - wartości zwracane przez semctl (dotyczą semafora sem_num) | |
GETVAT |
zwraca wartość semafora, czyli semvai |
SETVAL |
ustawia wartość semafora w ctl_arg. val |
GETPID |
zwraca wartość sempia |
GETNCNT |
zwraca semncnt |
GETZCNT |
zwraca semzcnt |
Operacje na wszystkich semaforach | |
GSTALIi |
umieszcza wszystkie semvals w ctl_arg. array |
SETALL |
ustawia wszystkie semvals zgodnie z ctl_arg. array |
Alokowanie i inicjowanie semaforów to dwie oddzielne operacje. Aby zainicjować semafor, musimy użyć funkcji semctl. Każdy semafor ma nieujemną wartość i umożliwia wykonanie operacji opuszczenia lub podniesienia semafora. Operacje te wykonuje wywołanie systemowe semop.
int semop(int semid, struct sembuf *op_array, size_t num_ops);
• Parametr semid musi być ważnym identyfikatorem semafora (wynik semget).
• Parametr op_array to tablica struktur sembuf (struktura sembuf jest zdefiniowana w <sys/sem.h>).
® Parametr num_ops jest liczbą struktur sembuf w tablicy. Każda struktura sembuf zawiera specyfikację operacji do wykonania na semaforze.
Wywołanie semop wykonuje się niepodzielnie na zestawach semaforów. Struktura sembuf zawiera następujące składowe:
sem_op>0 |
operacja V — powoduje zwiększenie wartości semafora o sem_op; jeśli jakiś proces czeka na nową wartość semafora, zostanie obudzony |
sem_op<0 |
operacja P - wstrzymuje proces lub powoduje zmniejszenie wartości semafora o sem_op |
sem_op=0 |
operacja czeka do chwili, gdy wartość semafora stanie się zerem |
struct sembuf {
unsigned short sem_num;/* indeks semafora w zestawie */
short sem_op; /* określa co zrobić */ short sem_flag;
}
Funkcja semop podejmuje próbę wykonania wszystkich wskazywanych operacji. Gdy chociaż jedna z operacji nie będzie możliwa do wykonania, nastąpi blokada procesu lub błąd wykonania funkcji semop, zależnie od ustawienia flagi. Aby operacja nie blokowała procesu, należy podać flagę IPC_NOWAIT, wtedy, jeżeli operacja miałaby blokować, wywołanie semop nie powiedzie się. Jeśli podamy flagę SEM_UNDO, Linux automatycznie cofnie operacje blokujące na semaforze przy zakończeniu procesu.