13

13



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

9.6. Generowanie szablonów i skryptu makefile za pomocą programu rpcgen

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 9.5. Pierwotna wersja programu obliczającego silnię (fact.cj

/*

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

Ilustracja 9.19. Plik z definicją protokołu dla programu wyliczającego silnię

/*

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

Ilustracja 9.20. Polecenie rpcgen z opcjami -a i -C

% 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


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixie int * print_hello_l(void *argp, CLIENT *clnt) { static int
Komunikacja między procesami w Unixie    _ rzone przez rpcgen. Plik f act_client. c t
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 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 Jeżeli proces zostanie uruchomiony lokalnie, zostanie również
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 jest ustawiany na 1 (TRUE). Jeżeli bufor wynikowy został wcześ
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