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.