Provided by:
manpages-pl-dev_20051117-1_all 
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
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 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)