shmget

Autres langues

Langue: pl

Autres versions - même langue

Version: 1993-11-28 (openSuse - 09/10/07)

Section: 2 (Appels système)

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)