W celu utworzenia nowego ( lub otworzenia ) segmentu pamięci używamy wywołania systemowego shmget():
WYWOŁANIE SYSTEMOWE: shmget();
PROTOTYP: int shmget ( key_t key, int size, int shmflg );
ZWRACA: identyfikator pamięci dzielonej, jeżeli sukces
-1 - błąd: errno = EINVAL ( nieprawidłowy rozmiar segmentu )
EEXIST ( segment istnieje, nie można utworzyć )
EIDRM ( segment czeka na usunięcie, lub usunięty )
ENOENT ( segment nie isnieje )
EACCES ( brak prawa dostępu )
ENOMEM ( brak pamięci do utworzenia segmentu )
UWAGI:
Pewnie przypomina ci to poprzednie wywołania z cyklu get.
Pierwszym argumentem jest klucz ( w naszym wypadku zwrócony przez ftok() ). Wartość ta porównywana jest do innych kluczy segmentów pamięci. Teraz akcja zależy od zawartości argumentu shmflg:
Utwórz segment jeżeli ten nie istnieje.
Użyte z IPC_CREAT zwraca błąd jeżeli segment już istnieje.
Jeżeli podano tylko IPC_CREAT shmget() zwraca identyfikator segmentu istniejącego lub utworzonego. W połączeniu z IPC_EXCL tworzony jest nowy segment lub wywołanie zwraca błąd. Gwarantuje nam to, iż to my tworzymy segment pamięci.
I tym razem możesz również z'OR'ować z maską ósemkowy tryb.
Utwórzmy szkielet funkcji tworzącej segment pamięci:
int open_segment( key_t keyval, int segsize )
{
int shmid;
if((shmid = shmget( keyval, segsize, IPC_CREAT | 0660 )) == -1)
{
return(-1);
}
return(shmid);
}
Zauważ, iż ustawiamy prawa dostępu na 0660. Ta prosta funkcja zwraca indentyfikator segmentu pamięci dzielonej lub -1. Klucz oraz rozmiar segmentu przekazywane są jako argumenty.
Następnym krokiem po otrzymaniu identyfikatora segmentu jest podłączenie lub mapowanie segmentu w obszar adresowy.