WYWOŁANIE SYSTEMOWE: semget()
Next: WYWOŁANIE SYSTEMOWE: semop()
Up: Semafory
Previous: Struktura sem w jądrze
  Contents
WYWOŁANIE SYSTEMOWE: semget()
W celu utworzenia nowego zestawu semaforów, lub dostępu do istniejącego,
używamy wywołania systemowego semget().
WYWOŁANIE SYSTEMOWE: semget();
PROTOTYP: int semget ( key_t key, int nsems, int semflg );
ZWRACA: indentyfikator IPC zestawu, jeżeli sukces
-1 - błąd: errno = EACCESS ( brak prawa dostępu )
EEXIST ( zestaw istnieje, nie można utworzyć (IPC_EXCL) )
EIDRM ( zestaw zaznaczony do usunięcia )
ENOENT ( zestaw nie istnieje, nie podano IPC_CREAT )
ENOMEM ( brak pamięci do utworzenia zestawu )
ENOSPC ( limit ilości zestawów przekroczony )
UWAGI:
Pierwszym argumentem dla semget() jest wartość klucza ( w naszym przypadku
zwrócona przez ftok()). Wartość ta porównywana jest do istniejących
kluczy. Teraz operacje otworzenia lub dostępu zależą od zawartości argumentu
semflg:
IPC_CREAT
Utwórz zestaw semaforów jeżeli jeszcze nie istnieje w jądrze.
IPC_EXCL
Użyte z IPC_CREAT zwraca błąd jeżeli zestaw już isnieje.
Jeżeli używamy samego IPC_CREAT semget() zwraca identyfikator
zestawu, który został utworzony lub identyfikator już istniejącego, który
posiada podaną wartość klucza. Jeżeli podano również IPC_EXCL zostanie
utworzony nowy zestaw lub wywołanie zwróci -1. Podanie tylko IPC_EXCL jest
bezużyteczne, jednak w połączeniu z IPC_CREAT gwarantuje nam, iż
nie używamy istniejącego semaforu.
Tak jak dla każdej innej formy IPC Systemu V możemy podać ósemkowe prawa dostępu,
które zostaną z'OR'owane z umaską aby utworzyć prawa dostępu dla zestawu.
Argument nsems określa liczbę semaforów, które zostaną utworzone dla
nowego zestawu. Reprezentuje to liczbę drukarek w naszym przykładzie.
Maxymalna liczba semaforów jest zdefiniowana w linux/sem.h:
#define SEMMSL 32 /* <=512 maxymalna liczba semaforów dla id */
Zauważ, iż arument nsems jest ignorowany gdy otwieramy już instniejący
zestaw.
Stwórzmy szkielet funkcji otwierającej lub tworzącej zestaw semaforów:
int open_semaphore_set( key_t keyval, int numsems )
{
int sid;
if ( ! numsems )
return(-1);
if((sid = semget( mykey, numsems, IPC_CREAT | 0660 )) == -1)
{
return(-1);
}
return(sid);
}
Zauważ, że używamy praw dostępu 0660. Nasza prosta funkcja zwraca identyfikator
zestawu (int) lub -1, jeżeli coś nie poszło. Musimy jej podać wartość klucza,
oraz liczbę semaforów, dla których mamy zająć miejsce, pod warunkiem, że tworzymy
zestaw. W przykładzie zaprezentowanym pod koniec rozdziału używamy również flagę
IPC_EXCL w celu sprawdzenia czy semafor istnieje.
Next: WYWOŁANIE SYSTEMOWE: semop()
Up: Semafory
Previous: Struktura sem w jądrze
  Contents
2000-03-01
Wyszukiwarka
Podobne podstrony:
node51 1node51node51node51 NPQJB35E4NBCZPRZOGPFJB7E3CZF6IJA5VUKCZAnode51 K7MFSTMOONEVK2SX3KH5YLVSTEGL2EUX2V5NJ7Ynode51 6USRY6ENSVW44GHI34INTYHNIYFXCIEPZX3NRTAnode51więcej podobnych podstron