Rechercher une page de manuel
shmget
Langue: pl
Version: 1993-11-28 (openSuse - 09/10/07)
Section: 2 (Appels système)
NAZWA
shmget - utworzenie segmentu pamiêci wspólnejSK£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)Contenus ©2006-2023 Benjamin Poulain
Design ©2006-2023 Maxime Vantorre