Provided by: manpages-pl-dev_0.5-1_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    przekazane łącznie z IPC_CREAT zapewnia sygnalizację błędu, jeśli segment już istnieje.

       mode_flags  (9 najmniej znaczących bitów) określa prawa dostępu do segmentu dla jego  właściciela,  grupy
                   oraz  reszty świata. 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.

       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_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).

       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 Zostały przekazane znaczniki IPC_CREAT | IPC_EXCL i segment o zadanym kluczu już istnieje.

       EINVAL Miał  zostać  utworzony  nowy  segment,  a  size  < SHMMIN lub size > SHMMAX, lub gdy nie miał być
              utworzony nowy segment, a segment o podanej wartości key istnieje,  lecz  size  jest  większe  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

       SVr4, POSIX.1-2001.

       SHM_HUGETLB jest nieprzenośnym rozszerzeniem Linuksa.

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  (w  razie
       powodzenia) utworzy nowy segment pamięci dzielonej.

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

       SHMALL Maksymalna  liczba stron pamięci dzielonej w systemie (pod Linuksem to ograniczenie można odczytać
              i zmienić, używając pliku /proc/sys/kernel/shmall).

       SHMMAX Maksymalny rozmiar w bajtach segmentu pamięci dzielonej: wartość  zależna  od  lokalnych  ustawień
              (pod Linuksem to ograniczenie można odczytać i zmienić, używając pliku /proc/sys/kernel/shmmax).

       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 Maksymalna liczba segmentów pamięci dzielonej w systemie: zależna od implementacji (obecnie  4096,
              ale  w wersjach Linuksa wcześniejszych niż 2.3.99 wynosiła 128; pod Linuksem 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

       shmat(2), shmctl(2), shmdt(2), ftok(3), capabilities(7), shm_overview(7), svipc(7)

O STRONIE

       Angielska  wersja  tej  strony  pochodzi  z  wydania  3.52  projektu  Linux man-pages. Opis projektu oraz
       informacje dotyczące zgłaszania błędów można znaleźć pod adresem http://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ą  3.52 oryginału.

Linux                                              2013-04-19                                          SHMGET(2)