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.
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.
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