Gives a Socket to Another Process
| Portability: |
SAS/C extension
|
#include <sys/types.h>
#include <sys/socket.h>
int givesocket_pid(int s, const struct clientpid *clientpid, pid_t pid,
unsigned char options);
int s;
struct clientpid * clientpid;
pid_t pid;
unsigned char options;
where:
-
int s
-
is the socket descriptor.
-
struct clientpid * clientpid
-
is the pointer to the
clientpid structure.
-
pid_t pid
-
is the process ID from
getclientpid().
-
unsigned char options
-
is the options flag.
The givesocket_pid
function is used to make a specified socket available to a takesocket_pid call issued by another
process.
givesocket_pid is similar
to the givesocket function. However, it uses
the information in the clientpid structure
returned by a call to the getclientpid function.
The socket identifier parameter, s,
must contain the descriptor of the socket to be given.
The clientpid structure
member domain must contain the same value as
those returned by the call to getclientpid.
If the domain member is 0, then a default of
AF_INET is used.
The options parameter
must be either binary zeros (0x00) or SO_CLOSE. If options is SO_CLOSE, then givesocket_pid
will close the socket identified by the given socket descriptor(s) and return
a unique socket token in the socket identifier parameter(s). This socket
token must be used as the socket identifier in a call to the takesocket_pid function.
If givesocket_pid
succeeds, it returns the socket identifier (that is, either a socket descriptor
or a token). Otherwise, it returns a
-1
, and sets errno to indicate the error.
Note:
The clientpid structure
upon return will contain the following values:
All other fields in the clientpid
structure are set to binary zeros (0x00).
Setting the options flag
to SO_CLOSE improves performance by allowing givesocket_pid to automatically close the socket rather then requiring the
application to do a select and a close.
If SO_CLOSE is not used to close the socket,
givesocket_pid will not close the socket, and the socket descriptor
is to be used in the call to takesocket_pid.
If the given socket is not closed, it can still be used,
even after the takesocket_pid has been done.
The socket can be shared between the giver and taker in the same way that
an inherited socket can be shared between parent and child after a fork has been issued.
If SO_CLOSE is not used to close the socket within the
givesocket_pid call, but instead the caller of givesocket_pid issues the close
some time later, it may be necessary to coordinate with the caller of takesocket_pid. The close itself
does not interfere with takesocket_pid, but
if additional sockets are accepted, given away, and closed before takesocket_pid is called, there can be several given sockets
with the same descriptor waiting to be taken. This can cause unpredictable
results.
To avoid this problem, a given socket can be selected,
and the program can find out from select when
the takesocket_pid call has been issued and
it is safe to call close. However, selecting
the main socket and having all given sockets wait for another connection,
or for one of the given sockets to be taken, is very expensive. ![[cautionend]](../common/images/cautend.gif)
The getclientpid
function is available only for integrated sockets an OS/390 Version 1 Release
3 or later.
givesocket_pid
is not portable to UNIX operating systems. On UNIX operating systems, sockets
are typically transferred from parent to child processes as a side effect
of the fork system.
givesocket, takesocket,
getclientid, getclientpid, takesocket_pid
Copyright © 2001
by SAS Institute Inc., Cary, NC, USA. All rights reserved.