Scroll to navigation

SEMGET(2) Podręcznik programisty Linuksa SEMGET(2)

NAZWA

semget - pobranie identyfikatora zestawu semaforów

SKŁADNIA


#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

int semget(key_t key, int nsems, int semflg);

OPIS

Funkcja ta zwraca identyfikator zestawu semaforów, skojarzonego z parametrem key. Jeśli key ma wartość IPC_PRIVATE lub, gdy z wartością key nie jest skojarzony żaden istniejący zestaw semaforów, a w parametrze semflg został przekazany znacznik IPC_CREAT (tzn. semflg & IPC_CREAT jest niezerowe), to tworzony jest nowy zestaw semaforów nsems.

Znaczniki IPC_CREAT i IPC_EXCL przekazywane parametrem semflg pełnią tę samą rolę w obsłudze semaforów, co O_CREAT i O_EXCL w parametrze mode funkcji systemowej open(2): np. funkcja semget zgłosi błąd, jeśli w semflg przekazane zostaną obydwa znaczniki IPC_CREAT i IPC_EXCL, zaś zestaw semaforów identyfikowany kluczem key już będzie istnieć.

Podczas tworzenia, 9 najmniej znaczących bitów argumentu semflg określa prawa dostępu do zestawu semaforów (dla właściciela, grupy i innych). Prawa dostępu mają ten sam format i takie samo znaczenie, co parametr mode funkcji systemowych open(2) i creat(2) (bity praw uruchamiania nie są istotne dla semaforów, natomiast bity praw zapisu oznaczają możliwość zmiany wartości semaforów).

Podczas tworzenia nowego zestawu semaforów semget inicjalizuje strukturę semid_ds związaną z zestawem semaforów w następujący sposób:

sem_perm.cuid oraz sem_perm.uid przypisany zostanie efektywny identyfikator użytkownika procesu wywołującego.
sem_perm.cgid oraz sem_perm.gid przypisany zostanie efektywny identyfikator grupy procesu wywołującego.
9 najmniej znaczącym bitom pola sem_perm.mode zostaną przypisane ich odpowiedniki z parametru semflg.
Polu sem_nsems przypisania zostanie, zawarta w parametrze nsems, liczba semaforów w zestawie.
sem_otime przyjmie wartość 0.
sem_ctime przypisany zostanie aktualny czas.

Parametr nsems może mieć wartość 0 (nie jest brany pod uwagę), jeśli nie będzie tworzony zestaw semaforów. W przeciwnym przypadku parametr nsems musi być większy od 0 i mniejszy lub równy maksymalnej liczbie semaforów w zestawie (SEMMSL).

Jeśli zestaw semaforów już istnieje, wówczas weryfikowane są prawa dostępu.

WARTOŚĆ ZWRACANA

W wyniku pomyślnego wykonania wywołania, funkcja zwróci identyfikator zestawu semaforów (nieujemną liczbę całkowitą). W przeciwnym przypadku zwróci -1, zaś zmiennej errno zostanie przypisany kod wskazujący rodzaj błędu.

BŁĘDY

W przypadku niepowodzenia, zmiennej errno zostanie przypisana jedna z następujących wartości:

Zestaw semaforów identyfikowany kluczem key istnieje, ale proces wywołujący nie ma praw dostępu do niego.
Zestaw semaforów o identyfikatorze key istnieje, ale w parametrze semflg przekazane zostały jednocześnie oba znaczniki IPC_CREAT i IPC_EXCL.
Nie ma zestawu semaforów o identyfikatorze key, zaś znacznik IPC_CREAT nie został przekazany w parametrze semflg.
nsems jest mniejsze niż 0 lub większe niż ograniczenie liczby semaforów w zestawie (SEMMSL), lub zestaw semaforów, do któregoodnosi się key już istnieje a nsems jest większe niż liczba semaforów w tym zestawie.
Zestaw semaforów powinien zostać utworzony, ale zabrakło pamięci na nową strukturę danych.
Nastąpiła próba przekroczenia ograniczenia liczby zestawów (SEMMNI), lub łącznej liczby semaforów w systemie (SEMMNS).

UWAGI

Stała IPC_PRIVATE nie jest znacznikiem, tylko specjalną wartością typu key_t. Jeśli zostanie ona przekazana jako wartość parametru key, wówczas (w razie pomyślnego wykonania) funkcja systemowa pominie wszystko oprócz najmniej znaczących 9 bitów semflg, tworząc nowy zestaw semaforów, nie posiadający identyfikatora.

Występują następujące ograniczenia zasobów systemowych, związane z wywołaniem semget:

Maksymalna liczba zestawów semaforów w systemie: zależna od polityki.
Maksymalna liczba semaforów w zestawie: zależna od implementacji (aktualnie 500).
Maksymalna liczba semaforów w systemie: zależna od polityki. Wartość większa niż SEMMSL * SEMMNI pozbawia to ograniczenie sensu.

USTERKI

Wybrana nazwa, IPC_PRIVATE, prawdopodobnie nie jest najszczęśliwsza. IPC_NEW w sposób bardziej przejrzysty odzwierciedlało by rolę tej wartości.

Struktury danych skojarzone z poszczególnymi semaforami z zestawu nie są inicjalizowane przez wywołanie systemowe. Aby zainicjalizować te struktury, należy następnie użyć dla tego zestawu semaforów wywołania semctl(2) z rozkazami SETVAL lub SETALL.

ZGODNE Z

SVr4, SVID. SVr4 dokumentuje dodatkowe stałe błędów: EFBIG, E2BIG, EAGAIN, ERANGE, EFAULT.

ZOBACZ TAKŻE

ftok(3), ipc(5), semctl(2), semop(2)

2002-01-04 Linux 2.5