HPlogo Berkeley Sockets/iX Reference Manual: HP 3000 MPE/iX Computer Systems > Chapter 3 File System Intrinsics

IOCTL

» 

Technical documentation

Complete book in PDF
» Feedback

 » Table of Contents

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

Feedback to webmaster