IOCTL [ Berkeley Sockets/iX Reference Manual ] MPE/iX 5.0 Documentation
Berkeley Sockets/iX Reference Manual
IOCTL
C Interface
#include <sys/ioctl.h>
int ioctl (s, request, arg)
int s;
int request;
void *arg;
Description
The ioctl function provides an interface for setting different
characteristics for a socket, and retrieving information on a socket.
The parameter s is a socket descriptor. The request parameter specifies
which command to perform on the socket. The commands are defined in
<sys/ioctl.h>. The different commands that are available are described
below.
Note: Any data structure referenced by arg must not contain any
pointers.
FIONREAD Returns the number of bytes immediately readable from
the socket in the long integer whose address is arg.
For SOCK_STREAM sockets, the number of bytes
currently readable from this socket is returned in
the integer with the address arg. For SOCK_DGRAM
sockets, the number of bytes currently readable, plus
the size of the sockaddr structure (defined in
<sys/socket.h>), is returned in the integer with the
address arg.
FIOSNBIO Enables or disables non-blocking I/O for the socket.
If the integer whose address is arg is non-zero, then
non-blocking I/O is enabled; that is, subsequent
reads and writes to the device file are handled in a
non-blocking manner (see below). If the integer
whose address is arg is 0, then non-blocking I/O is
disabled.
For reads, non-blocking I/O prevents all read
requests to that socket from blocking, whether the
requests succeed or fail. Such read requests
complete in one of three ways:
* If there is enough data available to satisfy
the entire request, the read completes
successfully, having read all of the data, and
returns the number of bytes read;
* If there is not enough data available to
satisfy the entire request, the read completes
successfully, having read as much data as
possible, and returns the number of bytes it
was able to read;
* If there is no data available, the read fails
and errno is set to EWOULDBLOCK.
For writes, non-blocking I/O prevents all write
requests to that socket from blocking, whether the
requests succeed or fail. Such a write request
completes in one of three ways:
* If there is enough space available in the
system to buffer all the data, the write
completes successfully having written out all
of the data, and returns the number of bytes
written;
* If there is not enough space in the buffer to
write out the entire request, the write
completes successfully, having written as much
data as possible, and returns the number of
bytes it was able to write;
* If there is no space in the buffer, the write
fails and errno is set to EWOULDBLOCK.
To prohibit non-blocking I/O from interfering with
the O_NDELAY flag (see fcntl section), the
functionality of O_NDELAY always supercedes the
functionality of non-blocking I/O. This means that if
O_NDELAY is set, the transport performs read requests
in accordance with the definition of O_NDELAY. When
O_NDELAY is not set, the definition of non-blocking
I/O applies.
When a socket is created, non-blocking I/O is
disabled.
Blocking mode is the default. See accept, connect,
recv, and send for an explanation of how non-blocking
mode is used.
FIOGNBIO Gets the status of non-blocking I/O. If non-blocking
I/O is enabled, then the integer whose address is arg
is set to 1. If non-blocking I/O is disabled, then
the integer whose address is arg is set to 0.
SIOCATMARK For SOCK_STREAM TCP sockets, upon return the integer
with the address arg is non-zero if urgent data has
arrived. For sockets other than SOCK_STREAM TCP
sockets, on return the integer with the address arg
is always zero.
SIOCSPGRP This request sets the process group or process ID
associated with the socket to be the value of the
integer with the address arg. A process group or
process ID associated with the socket in this manner
is signaled when the state of the socket changes:
SIGIO is delivered if the socket is asynchronous, as
described in FIOASYNC below. If the value of the
integer with the address arg is positive, the signal
is sent to the process whose process ID matches the
value specified. If the value is negative, the
signal is sent to all the processes that have a
process group equal to the absolute value of the
value specified. If the value is zero, no signal is
sent to any process. It is necessary to issue this
request with a non-zero integer value to enable the
signal delivery mechanism described above; the
default for the process group or process ID value is
zero.
SIOCGPGRP This request returns the process group or process ID
associated with the socket in the integer with the
address arg. If the value of the integer with the
address arg is positive, then the value returned
corresponds to a process ID. If the value is
negative, then the value corresponds to all processes
that have a process group equal to the absolute value
of that value.
FIOASYNC If the integer whose address is arg is non-zero, this
request sets the state of the socket as asynchronous.
Otherwise, the socket is put into synchronous mode
(the default). Asynchronous mode enables the
delivery of the SIGIO signal when a) new data
arrives, or b) for connection-oriented protocols,
whenever additional outgoing buffer space becomes
available, or when the connection is established or
broken. The process group or process ID associated
with the socket must be non-zero in order for SIGIO
signals to be sent; the signal is delivered according
to the semantics of SIOCGPGRP described above.
Since both the fcntl O_NONBLOCK and O_NDELAY flags and ioctl FIOSNBIO
requests are supported, some clarification on how these features interact
is necessary. If the O_NONBLOCK or O_NDELAY flag has been set, recv and
send requests behave accordingly, regardless of any FIOSNBIO requests.
If neither the O_NONBLOCK flag nor the O_NDELAY flag has been set,
FIOSNBIO requests control of the behavior of recv and send.
Return Value
If the call is successful, a 0 is returned. If an error has occurred, a
value of -1 is returned and errno is set to indicate the error.
Errors
ioctl fails if one or more of the following are true: IOC_OUT is ignored
if an error occurs.
[EBADF] The argument s is not a valid open file descriptor.
[EFAULT] The system detected a NULL address while attempting
to use the arg parameter passed by the caller.
[ENOTTY] The request is not appropriate to the selected
device.
[EINVAL] The request parameter of the arg parameter is
invalid, or a socket type that is not supported was
specified.
[EINTR] The ioctl call was interrupted by a signal.
[EPERM] Typically, this error indicates that an ioctl
request was attempted that is forbidden in some way
to the calling process.
MPE/iX Specific
Programs using ioctl() must be linked with the POSIX C library.
Author
ioctl was developed by AT&T and HP.
See Also
fcntl, getsockopt, socket
MPE/iX 5.0 Documentation