Provided by: manpages-pl-dev_0.7-2_all bug

NAZWA

       semget - pobranie identyfikatora zestawu semaforów Systemu V

SKŁADNIA

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>

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

OPIS

       Wywołanie systemowe semget() zwraca identyfikator zestawu semaforów Systemu V skojarzonego
       z parametrem key. Nowy zestaw składający się z nsems semaforów  zostanie utworzony,  jeśli
       parametr key będzie mieć wartość IPC_PRIVATE lub gdy zestaw semaforów skojarzony z key nie
       istnieje, a w parametrze semflg zostanie przekazany znacznik IPC_CREAT.

       Jeśli w parametrze semflg podano zarówno IPC_CREAT,  jak  i  IPC_EXCL  oraz  już  istnieje
       zestaw  semaforów o kluczu key, to semget() kończy się błędem, ustawiając errno na wartość
       EEXIST. (Działa to analogicznie do O_CREAT | O_EXCL w open(2)).

       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).  Bity te mają ten sam format i takie
       samo znaczenie, jak parametr mode wywołania open(2) (prawa uruchamiania nie są istotne dla
       semaforów, natomiast prawa zapisu oznaczają możliwość zmiany wartości semaforów).

       Podczas  tworzenia  nowego  zestawu  semaforów  semget()  inicjuje   związaną  z  zestawem
       semaforów strukturę semid_ds (patrz semctl(2)) w następujący sposób:

              sem_perm.cuid  i  sem_perm.uid   przyjmują   wartość   efektywnego   identyfikatora
              właściciela procesu wywołującego.

              sem_perm.cgid  i  sem_perm.gid  przyjmują  wartość efektywnego identyfikatora grupy
              procesu wywołującego.

              9 najmniej znaczących bitów  pola  sem_perm.mode  jest  kopiowanych  z  9  najmniej
              znaczących bitów semflg.

              sem_nsems jest ustawiane na wartość nsems.

              sem_otime przyjmie wartość 0.

              sem_ctime przypisywany jest bieżący 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żeli zestaw semaforów już istnieje, to weryfikowane są uprawnienia.

WARTOŚĆ ZWRACANA

       W przypadku pomyślnego zakończenia, funkcja zwraca identyfikator zestawu semaforów (liczbę
       nieujemną), a w przeciwnym przypadku  zwraca  -1  i  przypisuje  zmiennej  errno  stosowną
       wartość.

BŁĘDY

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

       EACCES Zestaw semaforów identyfikowany kluczem key istnieje, ale proces wywołujący ani nie
              ma praw dostępu do niego, ani nie ma ustawionego atrybutu CAP_IPC_OWNER.

       EEXIST IPC_CREAT  i  IPC_EXCL  określono  w  semflg,  lecz  zestaw  semaforów  dla key już
              istnieje.

       EINVAL nsems jest mniejsze niż 0 lub większe niż ograniczenie liczby semaforów w  zestawie
              (SEMMSL)

       EINVAL Zestaw  semaforów,  do którego odnosi się key już istnieje, lecz nsems jest większe
              niż liczba semaforów w tym zestawie.

       ENOENT Nie ma zestawu semaforów o identyfikatorze key  i  znacznik  IPC_CREAT  nie  został
              przekazany w parametrze semflg.

       ENOMEM Zestaw  semaforów  powinien  zostać  utworzony, ale w systemie brak jest pamięci na
              utworzenie nowej struktury danych.

       ENOSPC Nastąpiła próba przekroczenia ograniczenia liczby  zestawów  (SEMMNI)  lub  łącznej
              liczby semaforów w systemie (SEMMNS).

ZGODNE Z

       SVr4, POSIX.1-2001.

UWAGI

       Dołączenie  <sys/types.h>  i  <sys/ipc.h>  nie jest wymagane na Linuksie ani przez żadną z
       wersji  POSIX.  Jednak  niektóre  stare  implementacje  wymagają  dołączenia  tych  plików
       nagłówkowych,  SVID również dokumentuje ich dołączenie. Aplikacje które mają być przenośne
       na tego typu stare systemy mogą wymagać dołączenia omawianych plików nagłówkowych.

       IPC_PRIVATE nie jest znacznikiem, ale szczególną wartością typu key_t.  Jeśli  wartość  ta
       zostanie  użyta  jako  parametr  key,  to  system  uwzględni  jedynie  9 najniższych bitów
       parametru msgflg i (w razie powodzenia) utworzy nowy zestaw semaforów.

   Inicjowanie semaforów
       Wartości semaforów w nowo utworzonym zestawie są nieokreślone (POSIX.1-2001  jasno  o  tym
       mówi,   choć  POSIX.1-2008  określa,  że  przyszła  wersja  tego  standardu  może  wymagać
       implementacji inicjującej semafory z wartością 0). Mimo że Linux, tak jak i  wiele  innych
       implementacji,  nadaje  im  wartość początkową równą 0, to przenośne aplikacje nie powinny
       zależeć od tego zachowania i zamiast tego powinny  wyraźnie  inicjować  semafory  żądanymi
       wartościami.

       Aby  zainicjować  semafory,  należy  na zestawie semaforów użyć operacji SETVAL lub SETALL
       wywołania semctl(2). W sytuacji gdy wiele procesów  nie  wie,  który  pierwszy  zainicjuje
       zestaw  semaforów,  to  aby  uniknąć sytuacji wyścigu, można sprawdzić, czy pole sem_otime
       powiązanej struktury danych zwracanej  przez  operację  IPC_STAT  wywołania  semctl(2)  ma
       wartość niezerową.

   Limity semaforów
       Wywołania  semget()  dotyczą  następujące  ograniczenia  zasobów  związanych  z  zestawami
       semaforów:

       SEMMNI Limit liczby zestawów semaforów w systemie. W  systemach  Linux  przed  wersją 3.19
              domyślna  wartość  tego  limitu  wynosiła  128. Od Linuksa 3.19 jest to 32 000. Pod
              Linuksem to ograniczenie można odczytać i zmienić, używając  czwartego  pola  pliku
              /proc/sys/kernel/sem).

       SEMMSL Maksymalna  liczba semaforów dla danego ID semafora. W systemach Linux przed wersją
              3.19 domyślna wartość tego limitu wynosiła 250. Od Linuksa 3.19 jest to 32 000. Pod
              Linuksem  to  ograniczenie można odczytać i zmienić, używając pierwszego pola pliku
              /proc/sys/kernel/sem).

       SEMMNS Limit liczby semaforów w systemie:  wartość  zależna  od  lokalnych  ustawień  (pod
              Linuksem  to  ograniczenie  można  odczytać i zmienić, używając drugiego pola pliku
              /proc/sys/kernel/sem). Proszę zauważyć, że systemowa liczba semaforów jest  również
              ograniczona przez iloczyn SEMMSL i SEMMNI.

USTERKI

       Nazwa  IPC_PRIVATE  prawdopodobnie  nie  jest  najszczęśliwsza.  IPC_NEW w sposób bardziej
       przejrzysty odzwierciedlałoby rolę tej wartości.

ZOBACZ TAKŻE

       semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), svipc(7)

O STRONIE

       Angielska wersja tej strony  pochodzi  z  wydania  4.07  projektu  Linux  man-pages.  Opis
       projektu,  informacje  dotyczące  zgłaszania błędów, oraz najnowszą wersję oryginału można
       znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Rafał  Lewczuk  (PTM)
       <R.Lewczuk@elka.pw.edu.p>,  Andrzej  Krzysztofowicz  (PTM)  <ankry@mif.pg.gda.pl>,  Robert
       Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów  na
       stronie   http://sourceforge.net/projects/manpages-pl/.   Jest   zgodne   z  wersją   4.07
       oryginału.