/*
* Zwykły program w C z funkcją lokalną */
łinclude <stdio.h> łinclude <stdłib.h> void main(void) (
int print_hello(void);
if (print_hello ())
printf ('Misja spełniona\n"); else
printf ("Nie udało się"); exit TO);
)
int print_hello(void) (
return printf("Cześć, ludzie!\n");
W obecnej postaci programu funkcja print_hello i jej wywołanie znajdują się w tym samym pliku. Program 92, skompilowany i uruchomiony, daje rezultaty przedstawione na ilustracji 95.
% p92
Cześć, ludzię!
Misja spełniona
Pierwszy krok do przeprowadzenia pełnej konwersji programu z lokalną funkcją na program z wykonywaną zdalnie procedurą to utworzenie pliku definiującego protokół. Plik ten informuje system o tym, które procedury mają być skojarzone z programem-serwe-rem. Plik definicyjny zawiera specyfikację typu wartości zwracanej przez funkcję oraz typów danych przekazywanych jej w formie parametrów. W systemie RPC procedura zdalna należy do programu zdalnego, który działa w ramach procesu-serwera. Program zdalny oraz jego procedury składowe pisze się w języku RPC. Język ten jest w zasadzie formatem XDR z dwoma rozszerzeniami: typami program i version. Składnię języka RPC zamieszczono w dodatku C tej książki. Dodatkowe informacje na temat definicji i składni typów danych XDR zawierają strony 3N podręcznika man poświęcone hasłom xdr_simple i xdr_complex.
Na ilustracji 9.6 pokazano plik definiujący protokół dla funkcji piint_hello. Język RPC to mieszanina stylu składni C i Pascala. Domyślnym rozszerzeniem nazwy pliku z definicją protokołu jest jedna litera „x".
/*
* To jest plik z definicją protokołu napisany w języku RPC. Plik zostanie.
* przekazany do generatora rpcgen. Wszystkie procedury zdalne należą do
* zdalnego programu. Każda procedura ma nazwę i numer. Określa się również
* numer wersji, aby można było tworzyć różne odmiany tej samej procedury.
*/
/* 1 V program DISPLAYPRG (
/* 2 */ version DISPLAY_VER {
/* 3 *7 int print hellot void 1 = 1;
/* 4 V ) = 1;
/* 5 */ ) = 0x20000001;
Słowo kluczowe program wskazuje, że definiowany przez programistę identyfikator DI-SPLAY_PRG będzie nazwą programu zdalnej procedury.1 Nazwa programu, podobnie jak w przypadku dyrektywy Program w Pascalu, nie musi być identyczna z nazwą pliku wykonywalnego. Blok program (...) wyznacza grupę powiązanych zdalnych procedur. Jest w nim umieszczone słowo kluczowe version poprzedzające drugi identyfikator definiowany przez programistę, DISPLAY_VER, który służy do ustalania wersji zdalną procedury. Możliwe jest utrzymywanie kilku wersji tej samej procedury, z których każda oznaczona jest inną liczbą całkowitą. Ułatwia to modernizowanie programu i zapewnianie użytkownikom wstecznej kompatybilności. Jeżeli zmienią się typy argumentów, liczba argumentów albo typ zwracaną przez funkcję wartości, należy zmienić numer wersji. Ponieważ pierwszy raz generujemy zdalną procedurę, numer wersji ustalimy na 1 (robi się to, przypisując numer do całego bloku ujętego w nawiasy klamrowe). Wewnątrz bloku version (...) znajduje się deklaracja zdalną' procedury.2 Deklaracja zdalnej procedury poprzedza numer procedury. Ponieważ zdefiniowana jest tylko jedna procedura, przypisana wartość równa się 1. Po nawiasie klamrowym zamykającym blok programu znajduje się znak równości oraz szesnastkowa ośmiocyfrowa stała, która stanowi numer programu. Trójka <program, wersja, procedura> w jednoznaczny sposób identyfikuje zdalną procedurę. Aby zapobiec konfliktom, podczas przypisywania wartości liczbowych programom należy dostosować się do schematu numerowania przedstawionego w tabeli 9.2.
Specyfikaąe protokołów można rejestrować w firmie Sun, wysyłając prośbę (z dołączonym plikiem definicji protokołu) pod adres rpc@sun.com. Zaakceptowane specyfikacje otrzymują numer programu z kategorii zarządzanej przez Sima (z przedziału od 00000000-1FFFFFFF).
Opis
Kody
00000000-1FFFFFFF Zdefiniowane przez firmę Sun
20000000-3FFFFFFF Definiowalne przez użytkownika
40000000-5FFFFFFF Definiowalne przez użytkownika, który kody rezerwuje dynamicznie 60000000-FFFFFFFF Zarezerwowane dla przyszłych zastosowań
Jak pokazano poniżej, nazwę pliku z definicją protokołu należy przekazać w linii poleceń do kompilatora RPC, rpcgen:
% rpcgen -C hello.x
Kompilator generuje żądany kod C z implementaąą zdefiniowanego wywołania zdalnej procedury. Program rpcgen rozpoznaje wiele parametrów linii poleceń, spośród których
253
Identyfikatory są najczęściej pisane dużymi literami. Niemniej jednak jest to tylko konwencja, a nie wymóg.
Jeśli nazwę procedury zapisze się dużymi literami, to kompilator RPC (rpcgen) automatycznie zmieni wszystkie litery na maie.