Rechercher une page de manuel
shmget
Langue: pl
Version: 1993-11-28 (fedora - 25/11/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