17

17



Komunikacja między procesami w Unixie

morpheus % factclient morpheus Program do wyliczania silni Wpisz dodatnia liczbo całkowita 11 11! - 39916800

morpheus % factclient morpheus Program do wyliczania silni Wpisz dodatnia liczbę całkowita 15 Przepraszam, ale 15! to dla mnie za dużo! morpheus % rlogin obiwan obiwan % cd BOOK/rpc/exl obiwan % ps -ef | grep gray

0:00 ps -ef 0:00 grep gray 0:03 -csh


gray 22135 22082 26 11:02:20 pts/0 gray 22136 22082 7 11:02:20 pts/0 n*-=v    tinan on 11.n1.52 pts/0

obiwan % fact_client morpheus Program do wyliczania silni Wpisz dodatnia liczbę całkowitą 9 9! - 362880

obiwan % fact_cłient morpheus Program do wyliczania silni Wpisz dodatnia liczbę całkowita 98 Przepraszam, ale 98! to dla mnie za dużo! obiwan % logout

W poprzednim przykładzie serwer programu wyliczającego silnię został wywołany na stacji roboczej morpheus. Obecność procesu fact_server ujawnia polecenie ps. Poniżej widzimy uruchomienie programu klienta z nazwą hosta, na którym działa proces serwera, przekazywaną w postaci parametru. Klient prosi użytkownika o podanie na wejściu liczby całkowitej. Użytkownik wpisuje 11. Klient wywołuje zdalną procedurę z parametrem 11. Serwer odpowiada, wyliczając silnię, którą zwraca do klienta. Klient wyświetla otrzymaną liczbę. Następnie klient jest uruchamiany po raz kolejny, tym razem na wejściu otrzymuje wartość 15. Ponieważ silnia z 15 wykracza poza zakres liczb całkowitych długich serwera, klient otrzymuje w odpowiedzi 0, czyli informację, iż serwer sobie nie poradził z wyliczeniem właściwej liczby. Klient wyświetla stosowny komunikat o błędzie. Następnie użytkownik loguje się do innej stacji roboczej (obiwan) i zmienia katalog na taki, w którym znajdują się pliki wykonywalne aplikacji wyliczającej silnię. Gdy w wyniku zastosowanego polecenia ps stwierdzono, że w stacji roboczej działa proces-serwer, uruchomiono ponownie klienta. Tym razem otrzymał on nazwę stacji roboczej, na której działa serwer (morpheus). Program-klient pobiera liczbę całkowitą (wpisano 9). Liczba jest przekazywana za pośrednictwem zdalnego wywołania do serwera pracującego na stacji roboczej morpheus. Serwer wyznacza silnię i zwraca ją do klienta, który otrzymany wynik wyświetla na ekranie.

Ćwiczenie 9-5

Napisz aplikację klient-serwer działającą na podstawie systemu RPC, która będzie w jednym przebiegu, od lewej do prawej, wyznaczać wartość (ignorując faktyczną kolejność działań) prostego wyrażenia złożonego z szeregu jednocyfrowych liczb połączonych dwuargumentowymi działaniami: „+",    „/" (dzielenie całkowi-

tołiczbowe) i    Klient powinien pobierać wyrażenie i wywoływać zdalną proce

durę obsługiwaną przez odległy serwer, w której będą wykonywane wszystkie wyliczenia. Serwer powinien mieć osobną procedurę dla każdej z czterech operacji. Wypróbuj działanie swojej aplikacji na następujących sekwencjach wejściowych (pamiętaj o tym, że dzielenie przez 0 jest zabronione):

2*3/2+5-8 6 + 8 - 4 / 3 7-9/0

Wskazówka: Aby przekazać wiele parametrów, należy użyć polecenia rpcgen z opcją -N lub umieścić przekazywane parametry w strukturze, podając jedynie wskaźnik do struktury.

9.7. Kodowanie i dekodowanie arbitralnych typów danych

Aby system RPC mógł zapewniać wymianę danych między systemami o różnych architekturach, przekazywane dane muszą zostać wcześniej przekształcone do standardowego formatu XDR. Konwersja z własnej reprezentacji jednego procesu na format XDR jest nazywana szeregowaniem (seriaiization). Dane odebrane w formacie XDR są przekształcane do postaci właściwej systemowi docelowemu. Konwersja z formatu XDR do formatu wewnętrznego jest nazywana deszeregowaniem (deserialization). Aby był przezroczysty, proces konwersji musi uwzględniać takie elementy, jak: kolejność bajtów1, rozmiar liczby całkowitej, reprezentacja liczb zmiennoprzecinkowych czy reprezentacja łańcuchów znakowych. Niektóre różnice mogą wynikać z odmiennej budowy sprzętu. Inne są konsekwencją rozbieżności w koncepcjach systemów operacyjnych czy języków programowania. Zakłada się, że po przekształceniu danych ich poszczególne bajty (z których każdy składa się z ośmiu bitów) w różnych systemach są ze sobą kompatybilne (przenośne). Konwersje prostych danych standardowego typu (takich jak liczby całkowite, liczby zmiennoprzecinkowe, znaki itd.) są zaimplementowane za pomocą szeregu predefiniowanych procedur XDR niskiego poziomu2, zwanych czasem filtrami. Filtry te zwracają wartości logiczne (dane dwustanowe typu bool_t): TRUE w przypadku pomyślnego przekształcenia danych i FALSE w przypadku błędu. Każda z tych procedur wymaga dwóch parametrów w postaci: wskaźnika na rezultat oraz wskaźnika na uchwyt XDR. Te podstawowe procedury są wbudowane w inne, bardziej skomplikowane, używane do konwersji bardziej złożonych typów danych3, takich jak tablice. Szczegółowy opis sposobu prze-

111

1

   Na przykład 4-bajtowa liczba (32-bitowa) najstarszy bajt (MSB) jest zawsze maksymalnie z lewej strony, a najmłodszy (LSB) — z prawej. Jeżeli sekwencja bajtów tworzących liczbę jest uszeregowana od lewej do prawej, jak w przypadku systemów SPARC, nazywa się ją big-endian, jeżeli zaś od prawej do lewej, jak w linii procesorów 80x86, little-endian.

2

   Więcej informacji na ten temat znajduje się w podręczniku man na stronach z rozdziału 3N poświęconych hasłu xdr_simple.

3

   Więcej informacji na ten temat znajduje się w podręczniku man na stronach z rozdziału 3N poświęconych hasłu xdr_complex.


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixie powinno się używać w odniesieniu do poleceń, które nie prowadz
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 Unixiedo naszych badań wybierzemy tylko nieliczne. Zestawienie argume
Komunikacja między procesami w Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
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 typedef linę *line_ptr; /* wskaźnik na "dużo miejsca"
Komunikacja między procesami w Unixie jest ustawiany na 1 (TRUE). Jeżeli bufor wynikowy został wcześ
Komunikacja między procesami w Unixie_ if (rpc_stat != RPC_SUCCESS) if (rpc_stat !- RPC_TIM£DOUT) (
Komunikacja między procesami w UninieProgram 9.2. Prosty program w C wyświetlający krótki tekst /* *
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

więcej podobnych podstron