NAZWA¶
shmget - utworzenie segmentu pamięci wspólnej
SKŁADNIA¶
#include <sys/ipc.h>
 
#include <sys/shm.h>
 
int shmget(key_t key, int size, int
  shmflg);
OPIS¶
 Uwaga! To tłumaczenie może być nieaktualne!
Funkcja 
shmget() zwraca deskryptor segmentu pamięci wspólnej,
  skojarzonego z wartością (kluczem) przekazaną w parametrze
  
key. Nowy segment zostanie utworzony, Jeśli parametr 
key
  będzie mieć wartość 
IPC_PRIVATE lub jeśli
  będzie mieć inną wartość, a segment skojarzony z
  
key nie istnieje zaś w parametrze 
shmflg zostanie
  przekazany znacznik 
IPC_CREAT (tj. 
shmflg&IPC_CREAT
  nie jest równe 0), to zostanie utworzony nowy segment, a jego rozmiar
  będzie równy parametrowi 
size zaokrąglonemu w
  górę do wielokrotności 
PAGE_SIZE.
Wartość 
shmflg skłąda się z:
  - IPC_CREAT,
 
  - aby utworzyć nowy segment. Jeśli ten znaczniek
      nie zostanie ustawiony, to shmget() spróbuje znaleźć
      segment skojarzony z key i sprzwdzić, czy użytkownik ma
      uprawnienia dla dostępu do segmentu.
 
  - IPC_EXCL
 
  - przekazane łącznie z IPC_CREAT zapewnia
      sygnalizację błędu, jeśli segment już
    isnieje.
 
  - mode_flags (9 najmniej znaczących
    bitów)
 
  - określa prawa dostępu do segmentu dla jego
      właściciela, grupy oraz reszty świata. Prawa uruchamiania
      nie są obecnie przez system używane.
 
W momencie tworzenia segmentu, prawa dostępu są kopiowane z parametru
  
shmflg do pola 
shm_perm definiującej segment struktury
  
shmid_ds. Budowa struktury 
shmid_ds:
struct shmid_ds {
    struct ipc_perm shm_perm;    /* prawa dostępu */
    int	            shm_segsz;   /* rozmiar segmentu (w bajtach) */
    time_t	    shm_atime;   /* czas ostatniego dołączenia */
    time_t	    shm_dtime;   /* czas ostatniego odłączenia */
    time_t	    shm_ctime;   /* czas ostatniej modyfikacji */
    unsigned short  shm_cpid;    /* PID twórcy segmentu */
    unsigned short  shm_lpid;    /* PID ostatniego operującego procesu */
    short	    shm_nattch;	 /* aktualna liczba dołączeń */
};
struct ipc_perm {
    key_t  key;
    ushort uid;   /* euid i egid właściciela*/
    ushort gid;
    ushort cuid;  /* euid i egid twórcy */
    ushort cgid;
    ushort mode;  /* 9 najmniej znaczących bitów  shmflg */
    ushort seq;   /* numer porządkowy */
};
Podczas tworzenia segmentu pamięci wsólnej, funkcja ta inicjalizuje
  strukturę 
shmid_ds w następujący sposób:
  
  - shm_perm.cuid i shm_perm.uid przypisywany
      jest efektywny identyfikator użytkownika procesu, który
      wywołał shmget.
 
  
  - shm_perm.cgid i shm_perm.gid przypisywany
      jest efektywny identyfikator grupy procesu, który wywołał
      shmget.
 
  
  - 9 najmniej znaczących bitów parametru
      shmflg jest kopiowanych do pola shm_perm.mode.
 
  
  - shm_segsz przypisywana jest wartość
      parametru size.
 
  
  - Polom shm_lpid, shm_nattch, shm_atime
      i shm_dtime przypisywana jest wartość 0.
 
  
  - Polu shm_ctime przypisywany jest aktualny czas.
 
Jeśli dany segment pamięci wspólnej już istnieje,
  wówczas system sprawdza prawa dostępu oraz bada, czy segment nie
  został zaznaczony do usunięcia.
WYWOŁANIA SYSTEMOWE¶
  - fork()
 
  - Po wywołaniu fork() proces potomny dziedziczy
      dołączone segmenty pamięci wspólnej.
 
  - exec()
 
  - Po wywołaniu exec() wszystkie
      dołączone segmenty są odłączane (nie są
      usuwane).
 
  - exit()
 
  - Podczas wywoływania exit() wszystkie
      dołączone segmenty są odłączane (nie są
      usuwane).
 
WARTOŚĆ ZWRACANA¶
Funkcja po pomyślnym zakończeniu zwraca deskryptor segmentu, a -1,
  jeśli wystąpi błąd.
BŁĘDY¶
W przypadku wystąpienia błędu, zmiennej 
errno przypisywana
  jest jedna z następujących wartości:
  - EINVAL,
 
  - jeśli 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.
 
  - EEXIST,
 
  - jeśli przekazane zostały znaczniki IPC_CREAT |
      IPC_EXCL , ale segment o zadanym kluczu już istnieje.
 
  - EIDRM
 
  - jeśli segment został zaznaczony do usunięcia
      lub usunięty.
 
  - ENOSPC
 
  - jeśli przekroczony został limit ilości
      segmentów pamięci wspólnej w systemie (SHMMNI) lub
      sumarycznej wielkości wszystkich segmentów (SHMALL).
 
  - ENOENT,
 
  - jeśli segment o zadanej wartości key nie
      istnieje, a nie ustawiono znacznika IPC_CREAT.
 
  - EACCES,
 
  - jeśli użytkownik nie ma praw dostępu do
      zadanego segmentu pamięci wspólnej.
 
  - ENOMEM,
 
  - gdy nie uda się przydzielić pamięci dla
      segmentu.
 
UWAGI¶
IPC_PRIVATE nie jest znacznikiem, lecz wartością typu
  
key_t. Jeśli jako 
key zostanie użyta ta
  wartość specjalna, to funkcja zignoruje wszystko oprócz 9
  najmniej znaczących bitów 
shmflg i utworzy nowy segment
  pamięci wspólnej nie posiadający klucza (jeśli
  wywołanie zakończy się pomyślnie).
Następujące ograniczenia odnoszące się do zasobów
  pamięci wspólnej dotyczą funkcji 
shmget:
  - SHMALL
 
  - Maksymalna liczba stron pamięci użytych do
      stworzenia segmentów pamięci wspólnej: zależna od
      polityki.
 
  - SHMMAX
 
  - Maksymalny rozmiar (w bajtach) pojedynczego segmentu
      pamięci wspólnej: zależny od implementacji (aktualnie
    4MB).
 
  - SHMMIN
 
  - Minimalny rozmiar (w bajtach) pojedynczego segmentu
      pamięci wspólnej: zależny od implementacji (aktualnie 1
      bajt, ale efektywny minimalny rozmiar wynosi PAGE_SIZE ).
 
  - SHMMNI
 
  - Maksymalna liczba segmentów pamięci wspólnej
      w systemie: zależna od implementacji (aktualnie 4096, ale w wersjach
      Linuksa wcześniejszych niż 2.3.99 wynosiła 128)
 
System Linux nie stawia ograniczeń dotyczących ilości
  segmentów dołączonych do jednego procesu (
SHMSEG).
USTERKI¶
Wybrana nazwa, IPC_PRIVATE, prawdopodobnie nie jest najszczęśliwsza.
  IPC_NEW w sposób bardziej przejrzysty odzwierciedlało by rolę
  tej wartości.
ZGODNE Z¶
SVr4, SVID. SVr4 dokumentuje dodatkowy kod błędu EEXIST. Do wersji
  2.3.30 Linux zwracał EIDRM w przepadku wywołania 
shmget na
  segmencie pamięci wspólnej przeznaczonym do skasowania.
ZOBACZ TAKŻE¶
ftok(3), 
ipc(5), 
shmctl(2), 
shmat(2),
  
shmdt(2)
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
  Tłumaczenia Manuali i 
może nie być aktualne. W razie
  zauważenia różnic między powyższym opisem a
  rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
  zapoznanie się z oryginalną (angielską) wersją strony
  podręcznika za pomocą polecenia:
  
  - man --locale=C 2 shmget
 
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
  znaleźć pod adresem
  
http://sourceforge.net/projects/manpages-pl/.