Komunikacja między procesami w Unixie
łinclude "fact.h" long int *
calc_fac__l_svc (int *argp, struct svc_req static long int result;
/*
* * tu można wstawić kod serwera */
'4long int- total - 1, last = 0;
for (idx & *argp; idx -.1; '~-idx) { total -t- idx; if (total last)
_ result -,0; return (&resałt); '
* - & * y: ^ :
result -total; return ((result);
* rqstp)
■ ■ ’zy i r r.ok*
:Ks|§fo
7
y’zakres? */
Plik makefile wygenerowany przez rpcgen umieszczono na ilustracji 9.25
Ilustracja 9.25. Plik makeflle.fact wygenerowany przez rpcgen
# To jest szablonowy plik makefile wygenerowany przez rpcgen
# Parametry
CLIENT * fact_client SERVER = fact__server
SOURCESCLNT.c =
SOURCESCLNT.h =
SOURCES_SVC.C =
SOURCES~SVC.h =
SOORCES.x * fact.x
TARGETS_3VC.c = fact_svc.c fact_server.c TARGETS__CLNT. c = fact_clnt.c fact_client.c
TARGETS * fact.h fact^clnt-c fact_svc.c fact_client.c fact_server.c
OBJECTSCLNT « $(SOURCESJTLNT.c:%.C«%.o) $(TARGETS_CLNT.c:%.c=%.o) OBJECTS__SVC = $(SOURCES_SVC.c:%.c=%.o) $ (TARGETS_SVC.c:%.c=%.o)
# Opcje kompilatora
ĆFLAGS +« -g ‘ -
LDLIBS +*“ -Insi RPCGENFLAGS = -C
# Pliki docelowe
all : $(CLIENT) $<SERVER)
$(TARGETS) : $(SOURCES.x)
rpcgen $(RPCGENFLAGS) $(SOURCES.x)
$(OBJECTS_CLNT) : $(SOURCESCLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c) $(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)
$(CLIENT) : $(OBJECTS_CLNT)
$(LINK.c) -O $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)
$(SERVER) : $(OBJECTS_SVC)
$(LINK.c) -O $(SERVER) $(OBJECTS_SVC) $(LDLIBS)
clean:
$ (RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)
Pliku makefile można używać w postaci prawie nie zmienionej, jednak o zmianę aż proszą się opcje kompilatora. Można na przykład do RPCGENFLAGS dodać znacznik -C albo nakazać konsolidowanie biblioteki matematycznej, uzupełniając LDLIBS znacznikiem -lm. Jeżeli ma zostać użyty kompilator inny niż domyślny (w większości systemów jest nim cc), informację tę należy zamieścić w sekcji CC (na przykład CC=gcc w przypadku kompilatora GNU lub CC=cc w przypadku C++ firmy Sun). Program make zakłada, że skrypt opisujący zlecone mu zadania znajduje się w pliku o nazwie makefile. Ponieważ rpcgen tworzy skrypt zapisany w pliku o nazwie złożonej ze słowa makefile, kropki i nazwy pliku definicji protokołu (w naszym wypadku fact), użytkownik ma do dyspozycji dwie możliwości. Pierwsza: zmienić nazwę generowanego pliku na ma ke f i -le za pomocą polecenia mv. Druga: skorzystać z opcji -f polecenia make. Opcję tę należy uzupełnić nazwą, jaką ma otrzymać utworzony plik skryptu.
Rysunek 9.26 przedstawia sekwencję zdarzeń uzyskaną na skutek zastosowania w systemie autora polecenia make z opcją -f.
% make -f makefile.fact
cc -g -c fact_clnt.c -o fact_clnt.o
cc -g -c fact_client.c -o fact_cłient.o
cc -g o fact_client fact_clnt.o fact_client.o -Insi
cc -g -c fact__svc.c -o fact_svc.o
"fact_svc.c" . linę 70: warning: rlim_t assigned to int
"fact_svc.c", linę 55: warning: sig not used
"fact_svc.c", linę 195: warning: rlim_t assigned to int
"fact svc.c", linę 32: warning: : :_rpcpmstart defined but not used
cc -g -c fact_server.c -o fact_server.o
"fact_server.c", linę 10: warning: rqstp not used
cc -g -o fact_server fact_syc.o fact_server.o -Insi
Na ilustracji 9.27 pokazano sekwencję umożliwiającą uruchomienie aplikacji klient-serwer wyznaczającej silnię.
mcrpheus % fact_server
morpheus % |
ps -ef |
1 grep |
gray | ||||
gray |
283 |
273 56 |
03:11:07 |
term/2 |
0:02 |
-csh | |
gray |
2685 |
283 37 |
11:02:33 |
term/2 |
0:00 |
ps -ef | |
gray |
2686 |
283 5 |
11:02:33 |
term/2 |
0:00 |
grep gray | |
gray |
2680 |
1 31 |
11:00:30 |
0:00 |
fact_server |
275