Komunikacja między procesami w Unixie
(svc_req *) Client); Wywołać funkcję prze-
entering function print_hello_l_svc -- znaczoną na procedurę
tracę: 12 ok *= printf(''Cześć, ludzie!\n" ); zdalną.
Cześć, ludzie!
tracę: 13 return (&ok);
tracę: 14 )
leaving function print_hello_l_svc
tracę: 35 if (*return value)
tracę: 36 printf("Misja spełniona\n");
Misja spełniona tracę: 39 }
leaving function main execution completed, exit codę is 2 program exited with 2 (dbx) quit
Polecenie rpcgen może spełniać dodatkowe funkcje pomocne programistom tworzącym aplikaqe RPC. Jeżeli w argumentach polecenia poda się opcję -a (patrz ilustracja 9.7), rpcgen oprócz procedur wejścia klienta i serwera oraz pliku nagłówkowego wygeneruje zestaw plików szablonowych dla klienta i serwera oraz skrypt makefile umożliwiający zbudowanie całej aplikacji. Znacznik -a nie powoduje (jak znacznik -C) zastąpienia istniejących wcześniej procedur wejścia nowymi, lecz zatrzymanie rpcgen i wypisanie komunikatu ostrzeżenia, jeśli w katalogu bieżącym są obecne pliki szablonowe (o domyślnych nazwach). Dlatego, mając pewność, że plik z definicją protokołu jest prawidłowy, lepiej używać tylko znacznika --a. W przeciwnym razie trzeba ręcznie usuwać wygenerowane pliki szablonów lub zmieniać ich nazwy.
Rozpatrzmy program o nazwie f act. c (program 95), który pobiera od użytkownika liczbę całkowitą i zwraca jej silnię, o ile zmieści się ona w zakresie liczb całkowitych długich (w przeciwnym razie program zwraca 0).
/*
* Program wyliczający silnię */
finclude <stdio.h> void main (void) (
long int f_numb, calc_fact(int); int number;
printf (" Program do wyliczania silni\n"); printf("Wpisz dodatnią liczbę całkowitą"); scanf("%d", snumber) ; if (number < 0)
printf ("Ja nalegam, liczbę dodatnią! \n" else if((f_numb = calc_fact(number)) > 0) printf ("%d! - %d\n", number, f numb); else
nrintf (*Pr7.enras7affli ale %d! to dla mnie za dużo!\n". nunbar);
)
/*
* Wylicz silnię lub zwróć zero,
* jeśli liczba jest za duża.
*/
long int calc_fact (int n) {
long int total = 1, last - 0;
int idx;
for (idx = n; idx - 1; —idx) ( total *= idx;
if (total <= last) /* Czy przekroczony zakres? */ return (0); last = total;
return (total);
Zmieńmy program wyliczający silnię w aplikację klient-serwer, której klient będzie wysuwał żądanie wyznaczenia silni do oddalonego serwera. Aby to zrobić, zaczniemy od napisania poniższego pliku definicji protokołu (patrz ilustracja 9.19).
/*
* Plik definicji protokołu dla programu z silnia */
program FACTORIAL { version ONE (
long int CALC_FAC( int ) = 1;
) “ 1;
) - 0x20000049;
Użyjemy programu rpcgen z opcjami -a i -C, za pomocą którego wygenerujemy plik nagłówkowy, procedurę wejścia klienta i serwera, pliki szablonów klienta i serwera oraz plik makefile całej aplikacji. Kolejne etapy tego procesu pokazano na ilustracji 9.20.
% ls *fact* fact.x
% rpcgen -a -C fact.x % ls *fact*
fact.h fact_client*c fact__server.c makefile.fact
fact.x fact clnt.c fact svc.c
Jak widać, przekazanie do programu rpcgen definicji protokołu oraz opcji -a i -C powoduje utworzenie sześciu plików. Plik nagłówkowy, fact. h, oraz pliki procedur wejścia RPC, fact_clnt. c i fact_svc. c, są podobne pod względem zawartości i natury do tych z poprzedniego przykładu. Dodatkowych wyjaśnień wymagają trzy nowe pliki utwo-
269