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.



Paweł Niewiadomski
2000-10-17