next up previous contents
Next: WYWOŁANIE SYSTEMOWE: shmctl() Up: Pamięć dzielona Previous: WYWOŁANIE SYSTEMOWE: shmget()   Contents

WYWOŁANIE SYSTEMOWE: shmat()


     WYWOŁANIE SYSTEMOWE: shmat();                                                          
   
     PROTOTYP: int shmat ( int shmid, char *shmaddr, int shmflg);
       ZWRACA: adres pod którym segment został przyłączony do procesu
   	    -1 - błąd: errno = EINVAL ( nieprawidłowy ID IPC lub podano adress podłączenia )
                                  ENOMEM ( brak pamięci aby przyłączyć segment )
                                  EACCES ( brak pozwolenia )
     UWAGI:
   

Jeżeli argument addr = 0 jądro próbuje znaleźć niemapowany region. Jest to zalecany sposób użycia. Jednakże można również podać adres, jest to używane aby ułatwić dostęp do sprzętu, lub rozwiązać konflikty z innymi programami. Flaga SHM_RND może być z'OR'owana z argumentem shmflg aby wymusić stronicowe wyrównanie adresu ( zaokrąglenie w dół do najbliższego rozmiaru strony ).

Dodatkowo, jeżeli podano flagę SHM_RDONLY segment zostanie wmapowany jako "tylko do oczytu".

Jest to chyba najłatwiejsze wywołanie. Rozważ przykładową funkcję, której podajemy identyfikator segmentu, a ona zwraca adres pod którym segment został podłączony:


   char *attach_segment( int shmid )
   {
           return(shmat(shmid, 0, 0));
   }
   

Po poprawnym przyłączeniu segmentu otrzymujemy wskaźnik do początku segmentu, użycie segmentu jest po prostu użyciem wskaźnika. Pamiętaj aby zachować wartość początkową wskaźnika! Jeżeli tego nie zrobisz nie będziesz miał dostępu do początku segmentu.




2000-03-01


Poltronic