next up previous contents
Next: WYWOŁANIE SYSTEMOWE: shmat() Up: Pamięć dzielona Previous: Struktura shmid_ds w jądrze   Contents

WYWOŁANIE SYSTEMOWE: shmget()

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:

IPC_CREAT

Utwórz segment jeżeli ten nie istnieje.

IPC_EXCL

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.




2000-03-01


Poltronic