22

22



Komunikacja między procesami w Unixie jest ustawiany na 1 (TRUE). Jeżeli bufor wynikowy został wcześniej zarezerwowany i jest to pierwsze wywołanie procedury, tj. zagnieżdżenie (depth) jest równe 0 (jesteśmy przecież w procedurze wywoływanej rekurencyjnie), poprzednia zawartość bufora zostanie wyczyszczona za pomocą funkcji memset przez zapełnienie całego obszaru wartościami NULL. Równocześnie wskaźnik cur jest ustawiany na 0.

Następnie procedura próbuje otworzyć wskazany katalog. Jeśli jej się to uda, wywołuje funkcję chdir, aby do niego przejść (ten sposób eliminuje konieczność konstruowania pełnej ścieżki podczas sprawdzania bieżącego katalogu). W dalszej kolejności za pomocą funkcji readdir pobierana jest nazwa pierwszej pozycji katalogu. Do przejrzenia wszystkich pozycji zastosowano pętlę while. Testowane są pozycje, do których proces ma prawo dostępu. Test polega na sprawdzaniu, czy dana pozycja jest katalogiem. Jeżeli jest, ale nie zaczyna się od kropki, zwiększany jest licznik depth. Za pomocą funkcji tekstowej sprintf w buforze tymczasowo konstruowana jest sformatowana nazwa katalogu. Opis formatu nakazuje funkcji sprintf użyć wartości depth jako dynamicznej liczby spacji, która powinna zostać wstawiona przed nazwą katalogu. Do każdej pozycji dopisywany jest znak nowej linii. Sformatowana pozycja jest następnie kopiowana (za pomocą memc-py) pod adres w buforze wynikowym wskazanym wartością cur (przesunięciem). Następnie nazwa katalogu jest przekazywana ponownie (rekursywnie) do procedury do_dir_l_svc. Po powrocie z przetwarzania podkatalogu procedura cofa się poziom wyżej, przechodząc za pomocą chdir do katalogu nadrzędnego i zmniejszając odpowiednio licznik depth. Katalog jest zamykany, kiedy zostanie przeanalizowana jego cała zawartość. Wówczas procedura kończy działanie i zwraca wskaźnik na wynikowy bufor. Rezultat uruchomienia aplikacji klient-serwer wyświetlającej zawartość podanego katalogu pokazano na ilustracji 9.34. W przedstawionym tu przykładzie program serwera, tree_server, został uruchomiony na stacji roboczej o nazwie morpheus. Na stacji roboczej faust wydano polecenie zdalnej powłoki, rsh. Uruchomiono na niej program-klient aplikacji wyświetlającej drzewo katalogów (tree_client). W zdalnym poleceniu przekazano również nazwę stacji roboczej, w której działa serwer morpheus oraz katalog przeznaczony do zbadania.

Ilustracja 9.34. Przykładowe uruchomienie programu wyświetlającego drzewo katalogów

morpheus% tree_server

roorpheus% rsh faust Scwd/tree_client morpheus /etc/lp /etc/lp:

fd

classes

forms

interfaces

logs

r

Rn7ff7ł3ł 0! Zd^in? WuW0^W2n!e «»,nrorliii' mor\

Ćwiczenie 9-6    _ ,, _

W większości wersji systemu Unix polecenie spell korzysta z pliku zawierającego słownik poprawnych wyrazów. W systemie autora jest to plik /usr/share/ lib/dict/words (dokładne położenie tego pliku w konkretnym systemie można poznać, przeczytawszy strony podręcznika man związane z poleceniem man). Napisz aplikację klient-serwer, której klient będzie prosił serwer o nowe słowo, na co serwer wylosuje liczbę z odpowiedniego przedziału (ograniczonego faktyczną liczbą wyrazów w słowniku), odczyta wyraz określony wylosowaną pozycją w słowniku i przekaże go klientowi.

Ćwiczenie 9-7 _____

Zmodyfikuj przykład programu odczytującego drzewo katalogów tak, aby pro-ces-serwer rezerwował odpowiednie miejsce (węzeł listy wskaźników) na pozycję katalogową w razie potrzeby, a nie bufor stałej wielkości z odpowiednim zapasem miejsca. Niech do klienta będzie zwracana lista węzłów wskaźników (a nie tablica znaków). Pamiętaj o tym, aby zwolnić niewykorzystywane miejsce przed zakończeniem działania programu.

9.8. Wyszukiwanie usług RPC za pomocą rozsyłania (broadca* sting)

Jeden użytkownik może wysłać do wszystkich demonów rpcbind znajdujących się w sieci lokalnej komunikaty żądające zwrócenia informacji na temat określonej usługi. Takie żądania generuje się za pomocą wywołania sieciowego rpc_broadcast. Żądania rozsyłania są wysyłane za pośrednictwem bezpołączeniowego protokołu transportowego UDP. Po wysłaniu żądania może nadejść wiele odpowiedzi z tego samego serwera (nie wspominając nawet o konfiguracji wielu serwerów). W reakcji na każdą uzyskiwaną odpowiedź ipc_broadcast wywołuje odpowiednią predefiniowaną procedurę. Składnię i inne informacje na temat funkcji rpc_broadcast przedstawiono w tabeli 9.10.

285


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
Komunikacja między procesami w Unixie typedef linę *line_ptr; /* wskaźnik na "dużo miejsca"
Komunikacja między procesami w Unixie_ ■    Jeżeli klient wysunie kilka identycznych
Komunikacja między procesami w Unixie powinno się używać w odniesieniu do poleceń, które nie prowadz
Komunikacja między procesami w Unixiedo naszych badań wybierzemy tylko nieliczne. Zestawienie argume
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
Komunikacja między procesami w UnixieTabela 9.9. Zestawienie informacji o funkcji clnt_destroy Pli
Komunikacja między procesami w Unixie łinclude "fact.h" long
Komunikacja między procesami w Unixie morpheus % factclient morpheus Program do wyliczania silni&nbs
Komunikacja między procesami w Unixie_ if (rpc_stat != RPC_SUCCESS) if (rpc_stat !- RPC_TIM£DOUT) (
Komunikacja między procesami w Unlxle Funkcja rexec wymaga sześciu argumentów. Pierwszym jest wskaźn
, Komunikacja miedzy procesami w (Jnixie prowadzania konwersji, choć jest ciekawy, wykracza poza ram
image001 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeby wł
Wskazówki dotyczące komunikacji: Kluczowe w procesie pomagania jest, aby przez cały czas mieć świado
t3 166 212 153.    Przedmiot jest ustawiony na osi zwierciadła wklęsłego kulistego o
040 041 li J Rys. 4.11. Wykres indeksów jednopodstawowych. rok 1955=1. Wskaźnik myszy jest ustawiony

więcej podobnych podstron