The argument
s
is a socket that has been created with
socket(2),
bound to an address with
bind(2),
and is listening for connections after a
listen(2).
The
accept
system call extracts the first connection request on the
queue of pending connections, creates a new socket,
and allocates a new file descriptor for the socket which
inherits the state of the
O_NONBLOCK
property from the original socket
s.
If no pending connections are
present on the queue, and the original socket
is not marked as non-blocking,
accept
blocks the caller until a connection is present.
If the original socket
is marked non-blocking and no pending
connections are present on the queue,
accept
returns an error as described below.
The accepted socket
may not be used
to accept more connections.
The original socket
s
remains open.
The argument
addr
is a result argument that is filled-in with
the address of the connecting entity,
as known to the communications layer.
The exact format of the
addr
argument is determined by the domain in which the communication
is occurring.
A null pointer may be specified for
addr
if the address information is not desired;
in this case,
addrlen
is not used and should also be null.
Otherwise, the
addrlen
argument
is a value-result argument; it should initially contain the
amount of space pointed to by
addr;
on return it will contain the actual length (in bytes) of the
address returned.
This call
is used with connection-based socket types, currently with
SOCK_STREAM.
It is possible to
select(2)
a socket for the purposes of doing an
accept
by selecting it for read.
For certain protocols which require an explicit confirmation,
such as
ISO
or
DATAKIT,
accept
can be thought of
as merely dequeueing the next connection
request and not implying confirmation.
Confirmation can be implied by a normal read or write on the new
file descriptor, and rejection can be implied by closing the
new socket.
For some applications, performance may be enhanced by using an
accept_filter(9)
to pre-process incoming connections.