05

05



Komunikacja między procesami w Uninie

Program 9.2. Prosty program w C wyświetlający krótki tekst

/*

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

Ilustracja 9.5. wynik działania programu 9.2

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

Ilustracja 9.6. hello.xplik z definicją protokołu

/*

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

Tabela 9.2. Kody programu RPC

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

1

   Identyfikatory są najczęściej pisane dużymi literami. Niemniej jednak jest to tylko konwencja, a nie wymóg.

2

   Jeśli nazwę procedury zapisze się dużymi literami, to kompilator RPC (rpcgen) automatycznie zmieni wszystkie litery na maie.


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Uninie Semantyka i zastosowania pliku netconfig wykraczają poza ramy
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 morpheus % factclient morpheus Program do wyliczania silni&nbs
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 Unixiedo naszych badań wybierzemy tylko nieliczne. Zestawienie argume
Komunikacja między procesami w Unixle Plik hello. h utworzony przez rpcgen będzie włączany do kodu p
Komunikacja między procesami w Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
Komunikacja między procesami w Unixle łinclude "hello.h*    /* wygenerowany prze
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

więcej podobnych podstron