fischer@dssmv2.mpr.ca (Roger Fischer) (09/18/90)
A while ago there was a discussion about RPC servers forking a child task
to do the server function. I did not participate in that discussion.
When I run into the same problem a colleague showed me some of the
articles.
Here I would like to present a possible solution. Comments would be
greatly appreciated.
The problem I still have is how to return an error message when I
can't fork any more tasks or when the fork failed.
pmap_unset( PDIPROG, PDIVERS);
transport = svctcp_create( RPC_ANYSOCK, 0, 0);
svc_register( transport, PDIPROG, PDIVERS, pdirpprog_1, IPPROTO_TCP);
while (TRUE) {
new_socket = accept( transport->xp_sock, &caller_adr, &addr_len);
new_transport = svcfd_create( new_socket, 0, 0);
new_transport->xp_raddr = caller_addr;
new_transport->xp_addrlen = addr_len;
if (no_more_forks)
svcerr_systemerr( new_transport); /* maximum # of children exceeded */
else {
child_pid = fork();
if (child_pid < 0)
svcerr_systemerr( new_transport); /* fork failed */
else if (child_pid > 0) {
svc_destroy( transport);
svc_run();
/* should never get here */
svc_destroy( new_transport);
}
else
svc_destroy( new_transport);
}
}
/* should never get here */
svc_destroy( transport);
Roger
----------------------------------------------------------------------------
Roger W. Fischer fischer@mprgate.mpr.ca fischer@mprgate.UUCP
..seismo!ubc-cs!mprgate!fischer ...ihnp4!alberta!ubc-cs!mprgate!fischer