18

18



, Komunikacja miedzy procesami w (Jnixie prowadzania konwersji, choć jest ciekawy, wykracza poza ramy objętościowe niniejszej książki (jednorozdzialowego opisu systemu RPC). W tym miejscu wypada jedynie podkreślić, że wszystkie wspomniane wyżej procedury są potrzebne i że podczas przekazywania danych przez RPC należy wybrać odpowiednie funkcje konwersji. Na szczęście, jeżeli korzysta się z programu rpcgen, wszystkie stosowne funkcje są generowane automatycznie i umieszczane w osobnym pliku źródłowym, z którego mogą korzystać programy użytkownika. Ten plik z procedurami konwersji zarówno dla klienta, jak i serwera ma nazwę składającą się z nazwy pliku definicji protokołu oraz członu _xdr. c.

Aby zilustrować działanie konwersji, utworzymy aplikację wykonującą zdalne listowanie drzewiastej struktury katalogów. Kiedy serwer tej aplikacji otrzyma prawidłową nazwę katalogu, spróbuje przeanalizować wskazany katalog i wygenerować drzewo jego podkatalogów. Załóżmy, że dysponujemy następującą strukturą (patrz ilustracja 9.28): Jeżeli zażądamy od aplikacji wygenerowania drzewa podkatalogów katalogu /usrO, to dane wyjściowe zwrócone z aplikacji powinny przypominać te z ilustracji 9.29.

/

joe    bill    exO exl exź


Ilustracja 9.28. Hipotetyczna struktura katalogów

Ilustracja 9.29. Zawartość katalogu /usrO /usrO:

home

joe

bill

prgm

exO

exl

ex2

Analizowany katalog jest oznaczany dwukropkiem na końcu nazwy. Następnie każdy wyświetlony katalog jest wcinany względem jego przodka stosownie do jego pozycji w drzewie. Podkatalogi home i prgm są na tym samym poziomie, ich nazwy więc zostały wcięte o jednakową liczbę spacji. Podobnie jest z katalogami exO, exl i ex2, które są podkatalogami katalogu prgm.

Aplikacja będzie przekazywać od klienta do serwera nazwę katalogu przeznaczonego do przeanalizowania. Serwer zarezerwuje miejsce na tablicę o stałej wielkości1, w której będą przechowywane nazwy odczytanych katalogów. Tablica ta zostanie zwrócona do klienta w przypadku bezbłędnego zakończenia działania serwera. Jeżeli serwer napotka błędy, zwróci wartość NULL.

Tablica zostanie zapełniona danymi o drzewie katalogów odczytanymi zgodnie z poniższym algorytmem. Najpierw program otworzy przekazany mu katalog. Każdy wskaźnik na nazwę katalogu, dopóki nie będzie równy NULL, zostanie sprawdzony pod kątem dostępności. Uwaga! W przypadku gdy proces-serwer nie będzie miał uprawnień super-użytkownika, pewne katalogi mogą zostać pominięte. Jeśli pozycja jest dostępna i stanowi odwołanie do katalogu (a nie do pliku), przy czym, z oczywistych względów, nie będzie to katalog (kropka) ani (dwie kropki), to zostanie zapisana (już z odpowiednim wcięciem) w zarezerwowanej wcześniej tablicy. Aby wygodniej było później zapisywane dane wyświetlać, do każdej pozycji dopisywany jest od razu znak nowej linii (\ n), oddzielający bieżącą pozycję od następnej. Ponieważ struktury katalogów mają naturę rekursywną, po odczytaniu wszystkich podkatalogowych pozycji danego katalogu procedura tree wywoła rekurencyjnie siebie samą, przekazując w parametrze nazwę nowej pozycji. Kiedy cała zawartość katalogu będzie już w ten sposób przejrzana, katalog zostanie zamknięty. Po przeanalizowaniu całej struktury drzewiastej zapełniona tablica zwracana jest do klienta, który może wyświetlić jej zawartość. Na ilustracji 9.30 pokazano fragment takiej gotowej tablicy.

Ilustracja 9.30. Fragment zwróconej do klienta tablicy z nazwami pozycji podkatalogów danego katalogu /usrO

Plik z definicją protokołu tree. x dla powyższego programu pokazano na ilustracji 9.31.

Ilustracja 9.31. Plik definicji protokołu tree.x dla programu odczytującego zawartość danego katalogu /*

*    Plik definicji protokołu programu tree

*/

const    MAX    =    4096;    /*    górny limit rozmiaru pakietu wynosi 8K    */

const    DELIM    =    ''\n";    /*    do oddzielania poszczególnych pozycji katalog. */

const    INDENT=    5;    /*    liczba spacji wcięć jednego poziomu    */

const    DIR_1    =    128;    /*    maksymalna długość pozycji katalogowych    */

typedef char line(MAX]; /* dużo miejsca na wszystkie pozycje    */

279

1

Wiem, wiem. Nie jest to najlepszy sposób. Lepsze byłoby rezerwowanie dynamiczne, ponieważ nie jest jeszcze znany przyszły rozmiar danych. Jednak rozpatrujemy tylko przykład poglądowy. Dodanie dynamicznego rezerwowania jest przedmiotem jednego z ćwiczeń.


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixie powinno się używać w odniesieniu do poleceń, które nie prowadz
Komunikacja między procesami w Unlxle Funkcja rexec wymaga sześciu argumentów. Pierwszym jest wskaźn
Komunikacja między procesami w Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
Komunikacja między procesami w Unixie jest ustawiany na 1 (TRUE). Jeżeli bufor wynikowy został wcześ
image001 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeby wł
DSC00273 (6) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
DSC00277 (9) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
1 Komunikacja między procesami w UnixleĆwiczenie 8-8 Czy wynik działania programu 8.6 pozostanie tak
Komunikacja między procesami w Unixie_ ■    Jeżeli klient wysunie kilka identycznych
Komunikacja między procesami w UninieProgram 9.2. Prosty program w C wyświetlający krótki tekst /* *
Komunikacja między procesami w Unixiedo naszych badań wybierzemy tylko nieliczne. Zestawienie argume
Komunikacja między procesami w Unixle Plik hello. h utworzony przez rpcgen będzie włączany do kodu p
Komunikacja między procesami w Uninie Semantyka i zastosowania pliku netconfig wykraczają poza ramy
Komunikacja między procesami w Unixle łinclude "hello.h*    /* wygenerowany prze
Komunikacja między procesami w Unixie Jeżeli proces zostanie uruchomiony lokalnie, zostanie również
Komunikacja między procesami w Unixie int * print_hello_l(void *argp, CLIENT *clnt) { static int
Komunikacja między procesami w Unixie (svc_req *) Client);    Wywołać funkcję
Komunikacja między procesami w Unixie    _ rzone przez rpcgen. Plik f act_client. c t

więcej podobnych podstron