Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
shmget - utworzenie segmentu pamici wspolnej
SK/LADNIA
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, int size, int shmflg);
OPIS
Funkcja shmget() zwraca deskryptor segmentu pamici wspolnej,
skojarzonego z wartoci (kluczem) przekazan w parametrze key. Nowy
segment zostanie utworzony, Jeli parametr key bdzie mie warto
IPC_PRIVATE lub jeli bdzie 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 rowne 0), to zostanie
utworzony nowy segment, a jego rozmiar bdzie rowny parametrowi size
zaokrglonemu w gor do wielokrotnoci PAGE_SIZE.
Warto shmflg sklda si z:
IPC_CREAT, aby utworzy nowy segment. Jeli ten znaczniek nie zostanie
ustawiony, to shmget() sprobuje znale segment skojarzony z
key i sprzwdzi, czy uytkownik ma uprawnienia dla dostpu do
segmentu.
IPC_EXCL przekazane lcznie z IPC_CREAT zapewnia sygnalizacj bldu,
jeli segment ju isnieje.
mode_flags (9 najmniej znaczcych bit'ow)
okrela prawa dostpu do segmentu dla jego wlaciciela, grupy
oraz reszty wiata. Prawa uruchamiania nie s obecnie przez
system uywane.
W momencie tworzenia segmentu, prawa dostpu s kopiowane z parametru
shmflg do pola shm_perm definiujcej segment struktury shmid_ds. Budowa
struktury shmid_ds:
struct shmid_ds {
struct ipc_perm shm_perm; /* prawa dostpu */
int shm_segsz; /* rozmiar segmentu (w bajtach) */
time_t shm_atime; /* czas ostatniego dolczenia */
time_t shm_dtime; /* czas ostatniego odlczenia */
time_t shm_ctime; /* czas ostatniej modyfikacji */
unsigned short shm_cpid; /* PID tworcy segmentu */
unsigned short shm_lpid; /* PID ostatniego operujcego procesu */
short shm_nattch; /* aktualna liczba dolcze */
};
struct ipc_perm {
key_t key;
ushort uid; /* euid i egid wlaciciela*/
ushort gid;
ushort cuid; /* euid i egid tworcy */
ushort cgid;
ushort mode; /* 9 najmniej znaczcych bitow shmflg */
ushort seq; /* numer porzdkowy */
};
Podczas tworzenia segmentu pamici wsolnej, funkcja ta inicjalizuje
struktur shmid_ds w nastpujcy sposob:
shm_perm.cuid i shm_perm.uid przypisywany jest efektywny
identyfikator uytkownika procesu, ktory wywolal shmget.
shm_perm.cgid i shm_perm.gid przypisywany jest efektywny
identyfikator grupy procesu, ktory wywolal shmget.
9 najmniej znaczcych bitow 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.
Jeli dany segment pamici wspolnej ju istnieje, wowczas system sprawdza
prawa dostpu oraz bada, czy segment nie zostal zaznaczony do usunicia.
WYWO/LANIA SYSTEMOWE
fork() Po wywolaniu fork() proces potomny dziedziczy dolczone segmenty
pamici wspolnej.
exec() Po wywolaniu exec() wszystkie dolczone segmenty s odlczane (nie
s usuwane).
exit() Podczas wywolywania exit() wszystkie dolczone segmenty s
odlczane (nie s usuwane).
WARTO ZWRACANA
Funkcja po pomylnym zakoczeniu zwraca deskryptor segmentu, a -1, jeli
wystpi bld.
B/LDY
W przypadku wystpienia bldu, zmiennej errno przypisywana jest jedna z
nastpujcych wartoci:
EINVAL, jeli mial zosta utworzony nowy segment, a size < SHMMIN lub
size > SHMMAX, lub gdy nie mial by utworzony nowy segment,
a segment o podanej wartoci key istnieje, lecz size jest
wiksze ni rozmiar tego segmentu.
EEXIST, jeli przekazane zostaly znaczniki IPC_CREAT | IPC_EXCL ,
ale segment o zadanym kluczu ju istnieje.
EIDRM jeli segment zostal zaznaczony do usunicia lub usunity.
ENOSPC jeli przekroczony zostal limit iloci segmentow pamici
wspolnej w systemie (SHMMNI) lub sumarycznej wielkoci
wszystkich segmentow (SHMALL).
ENOENT, jeli segment o zadanej wartoci key nie istnieje, a nie
ustawiono znacznika IPC_CREAT.
EACCES, jeli uytkownik nie ma praw dostpu do zadanego segmentu
pamici wspolnej.
ENOMEM, gdy nie uda si przydzieli pamici dla segmentu.
UWAGI
IPC_PRIVATE nie jest znacznikiem, lecz wartoci typu key_t. Jeli jako
key zostanie uyta ta warto specjalna, to funkcja zignoruje wszystko
oprocz 9 najmniej znaczcych bitow shmflg i utworzy nowy segment pamici
wspolnej nie posiadajcy klucza (jeli wywolanie zakoczy si pomylnie).
Nastpujce ograniczenia odnoszce si do zasobow pamici wspolnej dotycz
funkcji shmget:
SHMALL Maksymalna liczba stron pamici uytych do stworzenia
segmentow pamici wspolnej: zalena od polityki.
SHMMAX Maksymalny rozmiar (w bajtach) pojedynczego segmentu pamici
wspolnej: zaleny od implementacji (aktualnie 4MB).
SHMMIN Minimalny rozmiar (w bajtach) pojedynczego segmentu pamici
wspolnej: zaleny od implementacji (aktualnie 1 bajt, ale
efektywny minimalny rozmiar wynosi PAGE_SIZE ).
SHMMNI Maksymalna liczba segmentow pamici wspolnej w systemie:
zalena od implementacji (aktualnie 4096, ale w wersjach
Linuksa wczeniejszych ni 2.3.99 wynosila 128)
System Linux nie stawia ogranicze dotyczcych iloci segmentow dolczonych
do jednego procesu (SHMSEG).
USTERKI
Wybrana nazwa, IPC_PRIVATE, prawdopodobnie nie jest najszczliwsza.
IPC_NEW w sposob bardziej przejrzysty odzwierciedlalo by rol tej
wartoci.
ZGODNE Z
SVr4, SVID. SVr4 dokumentuje dodatkowy kod bldu EEXIST. Do wersji
2.3.30 Linux zwracal EIDRM w przepadku wywolania shmget na segmencie
pamici wspolnej przeznaczonym do skasowania.
ZOBACZ TAKE
ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2)
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.