Provided by: manpages-pl-dev_4.13-4_all bug

NAZWA

       shmget - utworzenie segmentu pamięci dzielonej Systemu V

SKŁADNIA

       #include <sys/ipc.h>
       #include <sys/shm.h>

       int shmget(key_t key, size_t size, int shmflg);

OPIS

       shmget()  returns the identifier of the System V shared memory segment associated with the
       value of the argument key.  It may be used either to obtain the identifier of a previously
       created  shared  memory  segment  (when  shmflg  is  zero  and key does not have the value
       IPC_PRIVATE), or to create a new set.

       A new shared memory segment, with size equal to the value of size rounded up to a multiple
       of  PAGE_SIZE,  is  created  if key has the value IPC_PRIVATE or key isn't IPC_PRIVATE, no
       shared memory segment corresponding to key exists, and IPC_CREAT is specified in shmflg.

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

       Wartość shmflg składa się z:

       IPC_CREAT
              Tworzy nowy segment.  Jeśli  ten  znacznik  nie  zostanie  ustawiony,  to  shmget()
              spróbuje   znaleźć  segment  skojarzony  z  key  i  sprawdzić,  czy  użytkownik  ma
              uprawnienia dostępu do segmentu.

       IPC_EXCL
              Ta flaga przekazana łącznie z IPC_CREAT zapewnia, że to wywołanie utworzy  segment.
              Jeśli segment już istnieje, wywołanie zawiedzie.

       SHM_HUGETLB (od Linuksa 2.6)
              Allocate  the  segment  using  "huge  pages."  See  the  Linux  kernel  source file
              Documentation/admin-guide/mm/hugetlbpage.rst for further information.

       SHM_HUGE_2MB, SHM_HUGE_1GB (od Linuksa 3.8)
              Used in conjunction with SHM_HUGETLB  to  select  alternative  hugetlb  page  sizes
              (respectively, 2 MB and 1 GB)  on systems that support multiple hugetlb page sizes.

              Ogólniej,  pożądany  rozmiar  dużej strony można skonfigurować kodując go w sześciu
              bajtach na przesunięciu SHM_HUGE_SHIFT za pomocą logarytmu o podstawie 2.  Dlatego,
              powyższe dwie stałe są zdefiniowane jako:

                  #define SHM_HUGE_2MB    (21 << SHM_HUGE_SHIFT)
                  #define SHM_HUGE_1GB    (30 << SHM_HUGE_SHIFT)

              Dodatkowe  informacje  można  odnaleźć  przy omówieniu podobnie nazwanych stałych w
              mmap(2).

       SHM_NORESERVE (od Linuksa 2.6.15)
              Ten znacznik stosuje się w takim samym  celu  jak  znacznik  MAP_NORESERVE  funkcji
              mmap(2).  Nie  rezerwuje  przestrzeni  wymiany  dla tego segmentu. Jeśli przestrzeń
              wymiany zostanie zarezerwowana, ma się gwarancję, że  jest  możliwe  zmodyfikowanie
              segmentu.  Gdy  przestrzeń  wymiany  nie  jest zarezerwowana, można otrzymać sygnał
              SIGSEGV podczas  próby  zapisu  do  segmentu,  gdy  zabraknie  dostępnej  fizycznej
              pamięci. Patrz także opis pliku /proc/sys/vm/overcommit_memory w proc(5).

       Oprócz  powyższych  flag,  9  najmniej  znaczących  bitów  sgmflg określa prawa dostępu do
       segmentu dla jego właściciela, grupy oraz innych. Bity są w takim samym  formacie  i  mają
       takie  samo  znaczenie,  jak  parametr  mode  wywołania open(2). Prawa uruchamiania nie są
       obecnie używane przez system.

       Jeżeli tworzona jest nowa kolejka komunikatów, wywołanie to w następujący sposób  inicjuje
       strukturę danych msqid_ds (patrz msgctl(2)):

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

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

       • 9  najmniej znaczących bitów pola shm_perm.mode jest kopiowanych z 9 najmniej znaczących
         bitów shmflg.

       • shm_segsz jest ustawiane na wartość parametru size.

       • shm_lpid, shm_nattch, shm_atime i shm_dtime są ustawiane na 0.

       • shm_ctime jest ustawiane na bieżący czas.

       Jeśli dany segment pamięci dzielonej już istnieje, to są weryfikowane uprawnienia  i  jest
       sprawdzane, czy segment nie jest przeznaczony do usunięcia.

WARTOŚĆ ZWRACANA

       W  przypadku  powodzenia  zwracany  jest  poprawny identyfikator pamięci współdzielonej. W
       razie wystąpienia błędu zwracane jest -1 i ustawiana jest errno wskazując błąd.

BŁĘDY

       W przypadku wystąpienia błędu, zmiennej errno  przypisywana  jest  jedna  z  następujących
       wartości:

       EACCES The user does not have permission to access the shared memory segment, and does not
              have the CAP_IPC_OWNER capability in  the  user  namespace  that  governs  its  IPC
              namespace.

       EEXIST IPC_CREAT  i  IPC_EXCL  były określone w shmflg, lecz segment pamięci dzielonej już
              istnieje dla key.

       EINVAL Miał być utworzony nowy segment, a  wartość  size  jest  mniejsza  niż  SHMMIN  lub
              większa niż SHMMAX.

       EINVAL Segment  dla  podanego  key  istnieje,  lecz  size  jest  większy  niż rozmiar tego
              segmentu.

       ENFILE Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych plików.

       ENOENT Segment o zadanej wartości key nie istnieje i nie ustawiono znacznika IPC_CREAT.

       ENOMEM Nie udało się przydzielić pamięci dla segmentu.

       ENOSPC Wszystkie możliwe identyfikatory pamięci dzielonej  zostały  wykorzystane  (SHMMNI)
              lub  przydzielenie  segmentu  o  żądanym rozmiarze size spowodowałoby przekroczenie
              systemowego ograniczenia na wielkość pamięci dzielonej (SHMALL).

       EPERM  Podano znacznik SHM_HUGETLB, ale proces wywołujący  nie  był  uprzywilejowany  (nie
              miał ustawionego atrybutu CAP_IPC_LOCK).

ZGODNE Z

       POSIX.1-2001, POSIX.1-2008, SVr4.

       SHM_HUGETLB i SHM_NORESERVE są linuksowymi rozszerzeniami.

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 shmflg i utworzy nowy segment pamięci dzielonej.

   Limity pamięci dzielonej
       Następujące ograniczenia odnoszące się do  zasobów  pamięci  dzielonej  dotyczą  wywołania
       shmget():

       SHMALL Systemowy  limit  całkowitej  wielkości  pamięci  dzielonej, mierzony w jednostkach
              systemowego rozmiaru strony.

              W  Linuksie  to   ograniczenie   można   odczytać   i   zmienić,   używając   pliku
              /proc/sys/kernel/shmall. Od Linuksa 3.16 domyślną wartością tego limitu jest:

                  ULONG_MAX - 2^24

              Ta wartość (odpowiednia dla systemów 32 i 64-bitowych) skutkuje brakiem limitów dla
              alokacji. Ta  wartość,  zamiast  ULONG_MAX,  została  wybrana  jako  domyślna,  aby
              zapobiec  przypadkom  gdy  pewne  stare  aplikacje  zwiększały istniejący limit bez
              sprawdzania jego wartości bieżącej. Mogło to doprowadzić do przepełnienia wartości,
              jeśli limit był ustawiony na ULONG_MAX.

              Od Linuksa 2.4 do 3.15 domyślną wartością limitu było:

                  SHMMAX / PAGE_SIZE * (SHMMNI / 16)

              If SHMMAX and SHMMNI were not modified, then multiplying the result of this formula
              by the page size (to get a value in bytes) yielded a value of 8 GB as the limit  on
              the total memory used by all shared memory segments.

       SHMMAX Maksymalny rozmiar segmentu pamięci dzielonej w bajtach.

              W   Linuksie   to   ograniczenie   można   odczytać   i   zmienić,  używając  pliku
              /proc/sys/kernel/shmmax. Od Linuksa 3.16 domyślną wartością tego limitu jest:

                  ULONG_MAX - 2^24

              Ta wartość (odpowiednia dla systemów 32 i 64-bitowych) skutkuje brakiem limitów dla
              alokacji.  Wyjaśnienie  dlaczego  jest  to  wartość  domyślna  (zamiast  ULONG_MAX)
              znajduje się w opisie SHMALL.

              From Linux 2.2 up to Linux 3.15, the default value  of  this  limit  was  0x2000000
              (32 MB).

              Because  it is not possible to map just part of a shared memory segment, the amount
              of virtual memory places another limit on the maximum size of a usable segment: for
              example,  on  i386  the  largest  segments that can be mapped have a size of around
              2.8 GB, and on x86-64 the limit is around 127 TB.

       SHMMIN Minimalny rozmiar (w bajtach) pojedynczego segmentu pamięci dzielonej:  zależny  od
              implementacji (obecnie 1 bajt, ale efektywny minimalny rozmiar wynosi PAGE_SIZE).

       SHMMNI Systemowy limit liczby segmentów pamięci dzielonej. W Linuksie 2.2 domyślna wartość
              tego limitu wynosiła 128; od Linuksa 2.4 domyślna wartość wynosi 4096.

              W  Linuksie  to   ograniczenie   można   odczytać   i   zmienić,   używając   pliku
              /proc/sys/kernel/shmmni.

       System  Linux  nie  stawia  ograniczeń  dotyczących  liczby  segmentów  pamięci  dzielonej
       dołączonych do jednego procesu (SHMSEG).

   Uwagi linuksowe
       Do wersji  2.3.30  Linux  zwracał  EIDRM  dla  shmget()  na  segmencie  pamięci  dzielonej
       przeznaczonym do usunięcia.

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

       See shmop(2).

ZOBACZ TAKŻE

       memfd_create(2), shmat(2), shmctl(2), shmdt(2), ftok(3), capabilities(7), shm_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⟩.