11

11



Komunikacja między procesami w Unixie

Jeżeli proces zostanie uruchomiony lokalnie, zostanie również wywołany klient, który otrzyma (w postaci parametrów) nazwę bieżącej staq'i roboczej. Wtedy na ekranie znajdą się następujące informacje:

Ilustracja 9.14. Uruchamianie programu klienta

morpheus % Client morpheus Misja spełniona

Co ciekawe, program-klient wyświetlił komunikat „Misja spełniona", ale nie wyświetlił komunikatu „Cześć, ludzie!Rozwiązanie tej tajemnicy ma związek z urządze-nieię terminala skojarzonego ze standardowym wyjściem programu-serwera. Jak widać na ilustracji 9.13, zamiast urządzenia wyjściowego procesu-serwera została wyświetlona pozycja oznaczająca brak urządzenia. Świadczy to, że dane wyjściowe z serwera trafiają w próżnię. Problem można skorygować na kilka sposobów. Wynik z serwera można wysłać explicite na konsolę. Aby zaimplementować takie rozwiązanie, należy w programie otworzyć za pomocą funkcji fopen plik (urządzenie) /dev/console, po czym wyświetlić wynikowe dane na konsoli, używając funkcji fprintf z uzyskanym w ten sposób wskaźnikiem na zmienną typu FILE jako parametrem. Niestety z takim rozwiązaniem wiąże się pewien kłopot: użytkownik może nie mieć dostępu do urządzenia konsoli. W takiej sytuacji funkcja fopen okaże się nieskuteczna. Innym sposobem jest przekazanie urządzenia konsoli procesu klienta do serwera w postaci pierwszego parametru zdalnej procedury. Być może okaże się to rozwiązaniem trochę lepszym, ale wciąż nieskutecznym w przypadku, gdy procesy klienta i serwera znajdują się w różnych staąach roboczych (a tym samym dysponują różnymi urządzeniami). Trzecia metoda to napisanie serwera przekazującego komunikat z powrotem do klienta, który będzie go lokalnie wyświetlał.

Choć nasza apłikaąa typu klient-serwer wymaga jeszcze kilku drobnych szlifów, już teraz możemy ją przetestować w środowisku rozproszonym (w którym serwer i klient działają na różnych staq'ach roboczych). Jeżeli obie stacje robocze są homogeniczne (czyli jeżeli działa w nich ten sam system operacyjny), to możemy osiągnąć założony cel, wydając polecenie podobne do tego z ilustracji 9.15.

Ilustracja 9.15. Uruchamianie aplikacji klient-serwer w środowisku rozproszonym

morpheus % server

morpheus % rsh obiwan $cwd/client morpheus Misja spełniona

W powyższym przykładzie uruchamiamy program-serwer, pracując na stacji morpheus. Następnie, korzystając z polecenia zdalnej powłoki, rsh, uruchamiamy program-klient na stacji obiwan. Ponieważ katalog, w którym znajdują się programy aplikacji, nie jest wpisany do standardowego łańcucha ścieżek przeszukiwanych przez system, musimy przekazać jego nazwę (zapisaną w zmienną systemowej cwd) staqi roboczą, posługując się parametrami.1

Tak więc w naszym przykładzie program klienta będzie uruchomiony na stacji roboczej obiwan. Klientowi przekazywana jest nazwa stacji roboczej serwera, morpheus. Jak pokazano, proces klienta, działający na hoście obiwan, żąda z powodzeniem od stacji morpheus uruchomienia funkcji print_hello. Komunikat „Cześć, ludzie!" nadal nie jest wyświetlany, jak w poprzednim przykładzie (i z tego samego powodu). Przyjrzyjmy się również dwóm procedurom wejścia RPC, wygenerowanym przez rpc-gen. Plik hello_clnt. c jest stosunkowo niewielki (patrz ilustracja 9.16). Zawiera wywołanie funkcji print_hello_l.

Ćwiczenie 9-4

W poniższym programie użyto funkcji bibliotecznej ttyname wyświetlającej nazwę urządzenia wyjściowego skojarzonego z plikiem stdout.

łinclude <stdio.h> łinclude <stdlib.h> main (void) (

char *dev = ttyname(fiłeno(stdout)); if (dev)

printf("Urządzenie standardowego wyjścia (stdout): %s\n", dev); else

fprintf(stderr, "Urządzenie standardowego wyjścia (stdout) nieznane!\n");

Zmień programy klienta i serwera tak, aby urządzenie standardowego wyjścia skojarzone z plikiem stdout było wykrywane przez klienta i przekazywane do serwera w postaci pierwszego argumentu funkcji print_hello. Serwer otworzy urządzenie w trybie zapisu, aby wyświetlić komunikat „Cześć, ludzie! ".Wskazówka: nazwa urządzenia wyjściowego musi być zapisana jako tablica znaków, aby mogła zostać przekazana do serwera. Argument void w pliku definiującym protokół musi być zmieniony, aby wskazywał, iż przekazywanym argumentem jest tablica znakowa. W definicji typu nie można jednak użyć wyrażenia char *, ponieważ nie jest ono jednoznaczne — może oznaczać wskaźnik na jeden znak lub na całą tablicę. W języku RPC do definiowania tablicy znaków zakończonej znakiem NULL służy typ string.

Ilustracja 9.16. Plik hello_clnt.c

/*

*    Proszę nie modyfikować tego pliku.

*    Został on wygenerowany przez rpcgen.

*/

łinclude <memory.h>    /* dla funkcji memset */

łinclude "hello.h"

/* domyślny timeout można zmienić /* za pomocą dnt_control () */ static struct timeval TIMEOUT = { 25, 0 );

265

1

Zamiast zmiennej $swd do uzyskania bieżącego katalogu roboczego można użyć wyniku działania polecenia pwd. Jednakże sięganie do zmiennych jest bardziej efektywne niż uruchamianie poleceń.


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixie_ ■    Jeżeli klient wysunie kilka identycznych
Komunikacja między procesami w Unixie jest ustawiany na 1 (TRUE). Jeżeli bufor wynikowy został wcześ
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 i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
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 typedef linę *line_ptr; /* wskaźnik na "dużo miejsca"
Komunikacja między procesami w Unixie_ if (rpc_stat != RPC_SUCCESS) if (rpc_stat !- RPC_TIM£DOUT) (
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 Unlxle Funkcja rexec wymaga sześciu argumentów. Pierwszym jest wskaźn

więcej podobnych podstron