Provided by: manpages-pl-dev_0.7-2_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()  zwraca  identyfikator  segmentu  pamięci  dzielonej  Systemu V,  skojarzonego  z
       wartością (kluczem) przekazaną w parametrze key. Nowy segment, o rozmiarze równym wartości
       parametru  size zaokrąglonym w górę do wielokrotności PAGE_SIZE, zostanie utworzony, jeśli
       parametr key będzie mieć wartość IPC_PRIVATE lub  jeśli  będzie  mieć  inną  wartość  oraz
       segment  skojarzony z key nie istnieje, a w parametrze shmflg zostanie przekazany znacznik
       IPC_CREAT.

       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)
                   Dołącza  segment  używając  "wielkich  stron"  (huge pages). Dalsze informacje
                   można znaleźć w pliku Documentation/vm/hugetlbpage.txt w źródłach jądra Linux.

       SHM_HUGE_2MB, SHM_HUGE_1GB (od Linuksa 3.8)
                   Używany w połączeniu z SHM_HUGETLB do wybrania alternatywnych rozmiarów  stron
                   hugetlb  (odpowiednio,  2 MB i 1 GB) w systemach obsługujących wiele rozmiarów
                   stron hugetlb.

                   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 Użytkownik  nie  ma praw dostępu do żądanego segmentu pamięci dzielonej oraz nie ma
              ustawionego atrybutu  CAP_IPC_OWNER.

       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)

              Jeśli nie zmodyfikowano SHMMAX i SHMMNI,  to  przemnożenie  wyniku  tego  działania
              przez  rozmiar  strony  (aby  otrzymać  wartość w bajtach) dawało wartość 8 GB jako
              limit całkowitej pamięci używanej przez wszystkie segmenty pamięci dzielonej.

       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.

              Od Linuksa 2.2 do 3.15 domyślną wartością tego limitu było 0x2000000 (32 MB).

              Ponieważ nie da się przypisać jedynie fragmentu segmentu pamięci dzielonej, wartość
              pamięci wirtualnej nakłada kolejne ograniczenie na maksymalny  rozmiar  użytecznego
              segmentu  np.  na  architekturze  i386  największy  segment który można zmapować ma
              rozmiar około 2,8 GB, a na x86_64 limit ten wynosi około 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.

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

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