07

07



Komunikacja między procesami w Unixle

Plik hello. h utworzony przez rpcgen będzie włączany do kodu procedur wejścia serwera i klienta. Przed wielokrotnym włączeniem pliku chronią dyrektywy preprocesora #i f ndef _HEL-LO_H_RPCGEN, #define _HELLO_H_RPCGEN oraz #endif. Włączenie pliku <rpc/rpcii> umieszczone w pliku hello. h,jak odnotowano w wewnętrznym komentarzu z pliku rpc. h, powoduje: „...tylko włączenie miliardów plików nagłówkowych koniecznych do realizowania zdalnych

wywołań procedur"1. Zmienna cplusplus została użyta w celu stwierdzenia, czy obecne jest

środowisko C++. W środowisku tym kompilator dodaje wewnętrznie szereg przedrostków do nazw funkcji kodujących typy parametrów funkcji. Te przeredagowane nazwy umożliwiają sprawdzenie, czy parametry funkcji podczas wywołań są zgodne z ich definicjami. Kompilator C nie zapewnia przeredagowanych nazw funkcji, potrzebnych kompilatorowi C++. W związku z tym kompilator C++ należy przestrzec przed tym, że będą stosowane nie przeredagowane

nazwy funkcji. Do tego celu służy dyrektywa #ifdef _cplusplus.

Plik nagłówkowy zawiera także (w postaci stałych typu unsigned long) identyfikatory poprzedzone słowami kluczowymi program i yersion w pliku definicji protokołu. Ponieważ w wywołaniu programu rpcgen zastosowaliśmy opcję -c (nakazującą generowanie kodu zgodnego z normą ANSI C), interesująca nas instrukcja zawiera odgałęzienie if

dyrektywy preprocesora (#if defined (_STDC_)). Jeżeli nazwa zdalnej procedury

w pliku definiującym protokół została podana dużymi literami, w pliku nagłówkowym będzie już zapisana małymi. Nazwa procedury jest zdefiniowana jako numer procedury z pliku definicyjnego rzutowany na liczbę długą bez znaku (na typ unsigned long). Stałą tę napotkamy jeszcze raz w serwerowej procedurze wejścia, w instrukcji switch wybierającej właściwy kod wywołujący zdalną procedurę. Dalej znajdują się dwa prototypy funkq'i print_helło. Pierwszy z nich, określający funkcję print_hello_l, jest używany w procedurze wejścia klienta, drugi, print_hello_l_svc— w procedurze wejścia serwera. Konwencja nadawania nazw przejawia się jako zasada dołączania do nazwy zdalnej procedury znaku podkreślenia i numeru wersji w przypadku procedury klienta oraz znaku podkreślenia, numeru wersji i członu „svc" w przypadku procedury serwera. Odgałęzienie else dyrektywy preprocesora zawiera podobne definicje, ale przeznaczone dla środowisk nie korzystających ze standardowych prototypów funkcji C. Jeżeli opcja -c nie zostałaby użyta, wynikowy plik nagłówkowy zawierałby tylko jeden prototyp funkcji printjhello, a mianowicie print_hello_l.

Zanim zgłębimy utworzone przez program rpcgen procedury wejścia serwera i klienta, zastanówmy się, jak podzielić pierwotny program na składnik kliencki i serwerowy. Po podziale i zastosowaniu narzędzia rpcgen uzyskamy sześć plików (patrz ilustracja 9.9).

użytkownik pisze program rpcgen generuje z niego

proces-klient

proces-serwer


Ilustracja 9.9. Pliki i zależności typu klient-serwer

1 Choć komentarz jest napisany dość czupumie, nie odbiega daleko od prawdy (warto się o tym przekonać)!

Rozdział 9: Zdalne wywoływanie procedur (RPC)

Zaczniemy od pisania klienta. Jak w wyjściowym programie, klient będzie wywoływał funkcję print_hello. Jednak w naszej konfiguracji funkcja print_hello powinna być funkcją lokalną ulokowaną w osobnym programie (jest to program hello client. c pokazany poniżej jako program 9.3).

Program 9.3. Program klienta hello_client.c

t*

*    Program-KLIENT:    hello_client.c

*    Ten kod klienta będzie wykonywany przez proces lokalny.

*/

łinclude <stdio.h> tinclude <stdlib.h>

łinclude "hello.h"    /* wygenerowany przez rpcgen na podstawie hello.x ”,

void main(int argc, char *argv[]) 1 CLIENT    "Client;

int    *return_value,    filier;

char    *server;

/*

*    Trzeba podać nazwę hosta, w którym będzie uruchomiony program.

*    Nazwę można uzyskać z pierwszego argumentu linii poleceń.

*/

if (argc != 2)    {

fprintf(stderr, "Składnia: %s nazwa_hosta\n", *argv); exit<l);

server = a rqv[1];

/*

*    generowanie uchwytu klienta */

if ((Client = clnt_create(server, DISPLAYPRG, DXSPLAY_VER, "visible")) == (CLIENT *) NULL) ( clnt^pcreateerror(server);

}

return_value = print^hello^l((yoid *) sfiller, Client); if (*return_value)

printf ("Misja spełnióna\n"); else

printf("Nie udało się\n"); exit (0);

Choć spora porcja kodu jest podobna do oryginalnego programu, wprowadzone zostały pewne zmiany dostosowujące go do zdalnego wykonywania procedur. Przyjrzyjmy się im punkt po punkcie. Dołączono dwa dodatkowe odwołania do plików nagłówkowych. Klient będzie korzystał z wywołania systemowego exit, dlatego należało włączyć plik <stdlib. h> zawierający jego prototyp. Drugim włączanym plikiem jest hel lo. h, plik utworzony przez rpcgen (jego zawartość już została omówiona). Zakłada się, że plik ten rezyduje lokalnie.    . •

W tym przykładzie będziemy przekazywać dane z linii poleceń do funkcji main programu klienta, dlatego parametr void został zastąpiony standardowymi argumentami argc

257


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixle łinclude "hello.h*    /* wygenerowany prze
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    _ rzone przez rpcgen. Plik f act_client. c t
Komunikacja między procesami w Unixie int * print_hello_l(void *argp, CLIENT *clnt) { static int
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
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 Unlxle Funkcja rexec wymaga sześciu argumentów. Pierwszym jest wskaźn
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 Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
Komunikacja między procesami w Uninie Semantyka i zastosowania pliku netconfig wykraczają poza ramy
Komunikacja między procesami w Unixie Jeżeli proces zostanie uruchomiony lokalnie, zostanie również
Komunikacja między procesami w Unixie (svc_req *) Client);    Wywołać funkcję
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

więcej podobnych podstron