Provided by: manpages-pl-dev_4.13-4_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

       The  semget()   system  call returns the System V semaphore set identifier associated with
       the argument key.  It may be used either to obtain the identifier of a previously  created
       semaphore  set  (when  semflg  is zero and key does not have the value IPC_PRIVATE), or to
       create a new set.

       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 A semaphore set exists for key, but the calling process does not have permission to
              access  the  set,  and  does  not  have  the  CAP_IPC_OWNER  capability in the user
              namespace that governs its IPC namespace.

       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.

BŁĘDY

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

PRZYKŁADY

       The program shown below uses semget()  to create a new semaphore set or retrieve the ID of
       an existing set.  It generates  the  key  for  semget()  using  ftok(3).   The  first  two
       command-line  arguments  are  used as the pathname and proj_id arguments for ftok(3).  The
       third command-line argument is an integer that specifies the nsems argument for  semget().
       Command-line  options  can be used to specify the IPC_CREAT (-c)  and IPC_EXCL (-x)  flags
       for the call to semget().  The usage of this program is demonstrated below.

       We first create two files that will be used to generate keys  using  ftok(3),  create  two
       semaphore sets using those files, and then list the sets using ipcs(1):

           $ touch mykey mykey2
           $ ./t_semget -c mykey p 1
           ID = 9
           $ ./t_semget -c mykey2 p 2
           ID = 10
           $ ipcs -s

           ------ Semaphore Arrays --------
           key        semid      owner      perms      nsems
           0x7004136d 9          mtk        600        1
           0x70041368 10         mtk        600        2

       Next,  we demonstrate that when semctl(2)  is given the same key (as generated by the same
       arguments to ftok(3)), it returns the ID of the already existing semaphore set:

           $ ./t_semget -c mykey p 1
           ID = 9

       Finally, we demonstrate the kind of  collision  that  can  occur  when  ftok(3)  is  given
       different pathname arguments that have the same inode number:

           $ ln mykey link
           $ ls -i1 link mykey
           2233197 link
           2233197 mykey
           $ ./t_semget link p 1       # Generates same key as 'mykey'
           ID = 9

   Kod źródłowy programu

       /* t_semget.c

          Licensed under GNU General Public License v2 or later.
       */
       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>
       #include <sys/stat.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       static void
       usage(const char *pname)
       {
           fprintf(stderr, "Usage: %s [-cx] pathname proj-id num-sems\n",
                   pname);
           fprintf(stderr, "    -c           Use IPC_CREAT flag\n");
           fprintf(stderr, "    -x           Use IPC_EXCL flag\n");
           exit(EXIT_FAILURE);
       }

       int
       main(int argc, char *argv[])
       {
           int semid, nsems, flags, opt;
           key_t key;

           flags = 0;
           while ((opt = getopt(argc, argv, "cx")) != -1) {
               switch (opt) {
               case 'c': flags |= IPC_CREAT;   break;
               case 'x': flags |= IPC_EXCL;    break;
               default:  usage(argv[0]);
               }
           }

           if (argc != optind + 3)
               usage(argv[0]);

           key = ftok(argv[optind], argv[optind + 1][0]);
           if (key == -1) {
               perror("ftok");
               exit(EXIT_FAILURE);
           }

           nsems = atoi(argv[optind + 2]);

           semid = semget(key, nsems, flags | 0600);
           if (semid == -1) {
               perror("semget");
               exit(EXIT_FAILURE);
           }

           printf("ID = %d\n", semid);

           exit(EXIT_SUCCESS);
       }

ZOBACZ TAKŻE

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

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  5.10  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  są:  Rafał  Lewczuk
       <R.Lewczuk@elka.pw.edu.p>,  Andrzej  Krzysztofowicz   <ankry@green.mf.pg.gda.pl>,   Robert
       Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.