586 lines
28 KiB
HTML
586 lines
28 KiB
HTML
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<HTML><HEAD><TITLE>Man page of AIO</TITLE>
|
|
</HEAD><BODY>
|
|
<H1>AIO</H1>
|
|
Section: Linux Programmer's Manual (7)<BR>Updated: 2019-03-06<BR><A HREF="#index">Index</A>
|
|
<A HREF="/cgi-bin/man/man2html">Return to Main Contents</A><HR>
|
|
|
|
<A NAME="lbAB"> </A>
|
|
<H2>NAME</H2>
|
|
|
|
aio - POSIX asynchronous I/O overview
|
|
<A NAME="lbAC"> </A>
|
|
<H2>DESCRIPTION</H2>
|
|
|
|
The POSIX asynchronous I/O (AIO) interface allows applications
|
|
to initiate one or more I/O operations that are performed
|
|
asynchronously (i.e., in the background).
|
|
The application can elect to be notified of completion of
|
|
the I/O operation in a variety of ways:
|
|
by delivery of a signal, by instantiation of a thread,
|
|
or no notification at all.
|
|
<P>
|
|
|
|
The POSIX AIO interface consists of the following functions:
|
|
<DL COMPACT>
|
|
<DT id="1"><B><A HREF="/cgi-bin/man/man2html?3+aio_read">aio_read</A></B>(3)
|
|
|
|
<DD>
|
|
Enqueue a read request.
|
|
This is the asynchronous analog of
|
|
<B><A HREF="/cgi-bin/man/man2html?2+read">read</A></B>(2).
|
|
|
|
<DT id="2"><B><A HREF="/cgi-bin/man/man2html?3+aio_write">aio_write</A></B>(3)
|
|
|
|
<DD>
|
|
Enqueue a write request.
|
|
This is the asynchronous analog of
|
|
<B><A HREF="/cgi-bin/man/man2html?2+write">write</A></B>(2).
|
|
|
|
<DT id="3"><B><A HREF="/cgi-bin/man/man2html?3+aio_fsync">aio_fsync</A></B>(3)
|
|
|
|
<DD>
|
|
Enqueue a sync request for the I/O operations on a file descriptor.
|
|
This is the asynchronous analog of
|
|
<B><A HREF="/cgi-bin/man/man2html?2+fsync">fsync</A></B>(2)
|
|
|
|
and
|
|
<B><A HREF="/cgi-bin/man/man2html?2+fdatasync">fdatasync</A></B>(2).
|
|
|
|
<DT id="4"><B><A HREF="/cgi-bin/man/man2html?3+aio_error">aio_error</A></B>(3)
|
|
|
|
<DD>
|
|
Obtain the error status of an enqueued I/O request.
|
|
<DT id="5"><B><A HREF="/cgi-bin/man/man2html?3+aio_return">aio_return</A></B>(3)
|
|
|
|
<DD>
|
|
Obtain the return status of a completed I/O request.
|
|
<DT id="6"><B><A HREF="/cgi-bin/man/man2html?3+aio_suspend">aio_suspend</A></B>(3)
|
|
|
|
<DD>
|
|
Suspend the caller until one or more of a specified set of
|
|
I/O requests completes.
|
|
<DT id="7"><B><A HREF="/cgi-bin/man/man2html?3+aio_cancel">aio_cancel</A></B>(3)
|
|
|
|
<DD>
|
|
Attempt to cancel outstanding I/O requests on a specified
|
|
file descriptor.
|
|
<DT id="8"><B><A HREF="/cgi-bin/man/man2html?3+lio_listio">lio_listio</A></B>(3)
|
|
|
|
<DD>
|
|
Enqueue multiple I/O requests using a single function call.
|
|
</DL>
|
|
<P>
|
|
|
|
The
|
|
<I>aiocb</I>
|
|
|
|
("asynchronous I/O control block") structure defines
|
|
parameters that control an I/O operation.
|
|
An argument of this type is employed with all of the functions listed above.
|
|
This structure has the following form:
|
|
<P>
|
|
|
|
|
|
|
|
#include <<A HREF="file:///usr/include/aiocb.h">aiocb.h</A>>
|
|
<P>
|
|
struct aiocb {
|
|
<BR> /* The order of these fields is implementation-dependent */
|
|
<P>
|
|
<BR> int aio_fildes; /* File descriptor */
|
|
<BR> off_t aio_offset; /* File offset */
|
|
<BR> volatile void *aio_buf; /* Location of buffer */
|
|
<BR> size_t aio_nbytes; /* Length of transfer */
|
|
<BR> int aio_reqprio; /* Request priority */
|
|
<BR> struct sigevent aio_sigevent; /* Notification method */
|
|
<BR> int aio_lio_opcode; /* Operation to be performed;
|
|
<BR> lio_listio() only */
|
|
<P>
|
|
<BR> /* Various implementation-internal fields not shown */
|
|
};
|
|
<P>
|
|
/* Operation codes for 'aio_lio_opcode': */
|
|
<P>
|
|
enum { LIO_READ, LIO_WRITE, LIO_NOP };
|
|
|
|
|
|
<P>
|
|
|
|
The fields of this structure are as follows:
|
|
<DL COMPACT>
|
|
<DT id="9"><I>aio_fildes</I>
|
|
|
|
<DD>
|
|
The file descriptor on which the I/O operation is to be performed.
|
|
<DT id="10"><I>aio_offset</I>
|
|
|
|
<DD>
|
|
This is the file offset at which the I/O operation is to be performed.
|
|
<DT id="11"><I>aio_buf</I>
|
|
|
|
<DD>
|
|
This is the buffer used to transfer data for a read or write operation.
|
|
<DT id="12"><I>aio_nbytes</I>
|
|
|
|
<DD>
|
|
This is the size of the buffer pointed to by
|
|
<I>aio_buf</I>.
|
|
|
|
<DT id="13"><I>aio_reqprio</I>
|
|
|
|
<DD>
|
|
This field specifies a value that is subtracted
|
|
from the calling thread's real-time priority in order to
|
|
determine the priority for execution of this I/O request (see
|
|
<B><A HREF="/cgi-bin/man/man2html?3+pthread_setschedparam">pthread_setschedparam</A></B>(3)).
|
|
|
|
The specified value must be between 0 and the value returned by
|
|
<I>sysconf(_SC_AIO_PRIO_DELTA_MAX)</I>.
|
|
|
|
This field is ignored for file synchronization operations.
|
|
<DT id="14"><I>aio_sigevent</I>
|
|
|
|
<DD>
|
|
This field is a structure that specifies how the caller is
|
|
to be notified when the asynchronous I/O operation completes.
|
|
Possible values for
|
|
<I>aio_sigevent.sigev_notify</I>
|
|
|
|
are
|
|
<B>SIGEV_NONE</B>,
|
|
|
|
<B>SIGEV_SIGNAL</B>,
|
|
|
|
and
|
|
<B>SIGEV_THREAD</B>.
|
|
|
|
See
|
|
<B><A HREF="/cgi-bin/man/man2html?7+sigevent">sigevent</A></B>(7)
|
|
|
|
for further details.
|
|
<DT id="15"><I>aio_lio_opcode</I>
|
|
|
|
<DD>
|
|
The type of operation to be performed; used only for
|
|
<B><A HREF="/cgi-bin/man/man2html?3+lio_listio">lio_listio</A></B>(3).
|
|
|
|
</DL>
|
|
<P>
|
|
|
|
In addition to the standard functions listed above,
|
|
the GNU C library provides the following extension to the POSIX AIO API:
|
|
<DL COMPACT>
|
|
<DT id="16"><B><A HREF="/cgi-bin/man/man2html?3+aio_init">aio_init</A></B>(3)
|
|
|
|
<DD>
|
|
Set parameters for tuning the behavior of the glibc POSIX AIO implementation.
|
|
</DL>
|
|
<A NAME="lbAD"> </A>
|
|
<H2>ERRORS</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="17"><B>EINVAL</B>
|
|
|
|
<DD>
|
|
The
|
|
<I>aio_reqprio</I>
|
|
|
|
field of the
|
|
<I>aiocb</I>
|
|
|
|
structure was less than 0,
|
|
or was greater than the limit returned by the call
|
|
<I>sysconf(_SC_AIO_PRIO_DELTA_MAX)</I>.
|
|
|
|
</DL>
|
|
<A NAME="lbAE"> </A>
|
|
<H2>VERSIONS</H2>
|
|
|
|
The POSIX AIO interfaces are provided by glibc since version 2.1.
|
|
<A NAME="lbAF"> </A>
|
|
<H2>CONFORMING TO</H2>
|
|
|
|
POSIX.1-2001, POSIX.1-2008.
|
|
<A NAME="lbAG"> </A>
|
|
<H2>NOTES</H2>
|
|
|
|
It is a good idea to zero out the control block buffer before use (see
|
|
<B><A HREF="/cgi-bin/man/man2html?3+memset">memset</A></B>(3)).
|
|
|
|
The control block buffer and the buffer pointed to by
|
|
<I>aio_buf</I>
|
|
|
|
must not be changed while the I/O operation is in progress.
|
|
These buffers must remain valid until the I/O operation completes.
|
|
<P>
|
|
|
|
Simultaneous asynchronous read or write operations using the same
|
|
<I>aiocb</I>
|
|
|
|
structure yield undefined results.
|
|
<P>
|
|
|
|
The current Linux POSIX AIO implementation is provided in user space by glibc.
|
|
This has a number of limitations, most notably that maintaining multiple
|
|
threads to perform I/O operations is expensive and scales poorly.
|
|
Work has been in progress for some time on a kernel
|
|
state-machine-based implementation of asynchronous I/O
|
|
(see
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_submit">io_submit</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_setup">io_setup</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_cancel">io_cancel</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_destroy">io_destroy</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_getevents">io_getevents</A></B>(2)),
|
|
|
|
but this implementation hasn't yet matured to the point where
|
|
the POSIX AIO implementation can be completely
|
|
reimplemented using the kernel system calls.
|
|
|
|
|
|
|
|
<A NAME="lbAH"> </A>
|
|
<H2>EXAMPLE</H2>
|
|
|
|
The program below opens each of the files named in its command-line
|
|
arguments and queues a request on the resulting file descriptor using
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_read">aio_read</A></B>(3).
|
|
|
|
The program then loops,
|
|
periodically monitoring each of the I/O operations
|
|
that is still in progress using
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_error">aio_error</A></B>(3).
|
|
|
|
Each of the I/O requests is set up to provide notification by delivery
|
|
of a signal.
|
|
After all I/O requests have completed,
|
|
the program retrieves their status using
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_return">aio_return</A></B>(3).
|
|
|
|
<P>
|
|
|
|
The
|
|
<B>SIGQUIT</B>
|
|
|
|
signal (generated by typing control-\) causes the program to request
|
|
cancellation of each of the outstanding requests using
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_cancel">aio_cancel</A></B>(3).
|
|
|
|
<P>
|
|
|
|
Here is an example of what we might see when running this program.
|
|
In this example, the program queues two requests to standard input,
|
|
and these are satisfied by two lines of input containing
|
|
"abc" and "x".
|
|
<P>
|
|
|
|
|
|
|
|
$ <B>./a.out /dev/stdin /dev/stdin</B>
|
|
opened /dev/stdin on descriptor 3
|
|
opened /dev/stdin on descriptor 4
|
|
aio_error():
|
|
<BR> for request 0 (descriptor 3): In progress
|
|
<BR> for request 1 (descriptor 4): In progress
|
|
<B>abc</B>
|
|
I/O completion signal received
|
|
aio_error():
|
|
<BR> for request 0 (descriptor 3): I/O succeeded
|
|
<BR> for request 1 (descriptor 4): In progress
|
|
aio_error():
|
|
<BR> for request 1 (descriptor 4): In progress
|
|
<B>x</B>
|
|
I/O completion signal received
|
|
aio_error():
|
|
<BR> for request 1 (descriptor 4): I/O succeeded
|
|
All I/O requests completed
|
|
aio_return():
|
|
<BR> for request 0 (descriptor 3): 4
|
|
<BR> for request 1 (descriptor 4): 2
|
|
|
|
|
|
<A NAME="lbAI"> </A>
|
|
<H3>Program source</H3>
|
|
|
|
|
|
|
|
#include <<A HREF="file:///usr/include/fcntl.h">fcntl.h</A>>
|
|
#include <<A HREF="file:///usr/include/stdlib.h">stdlib.h</A>>
|
|
#include <<A HREF="file:///usr/include/unistd.h">unistd.h</A>>
|
|
#include <<A HREF="file:///usr/include/stdio.h">stdio.h</A>>
|
|
#include <<A HREF="file:///usr/include/errno.h">errno.h</A>>
|
|
#include <<A HREF="file:///usr/include/aio.h">aio.h</A>>
|
|
#include <<A HREF="file:///usr/include/signal.h">signal.h</A>>
|
|
<P>
|
|
#define BUF_SIZE 20 /* Size of buffers for read operations */
|
|
<P>
|
|
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
|
|
<P>
|
|
#define errMsg(msg) do { perror(msg); } while (0)
|
|
<P>
|
|
struct ioRequest { /* Application-defined structure for tracking
|
|
<BR> I/O requests */
|
|
<BR> int reqNum;
|
|
<BR> int status;
|
|
<BR> struct aiocb *aiocbp;
|
|
};
|
|
<P>
|
|
static volatile sig_atomic_t gotSIGQUIT = 0;
|
|
<BR> /* On delivery of SIGQUIT, we attempt to
|
|
<BR> cancel all outstanding I/O requests */
|
|
<P>
|
|
static void /* Handler for SIGQUIT */
|
|
quitHandler(int sig)
|
|
{
|
|
<BR> gotSIGQUIT = 1;
|
|
}
|
|
<P>
|
|
#define IO_SIGNAL SIGUSR1 /* Signal used to notify I/O completion */
|
|
<P>
|
|
static void /* Handler for I/O completion signal */
|
|
aioSigHandler(int sig, siginfo_t *si, void *ucontext)
|
|
{
|
|
<BR> if (si->si_code == SI_ASYNCIO) {
|
|
<BR> write(STDOUT_FILENO, "I/O completion signal received\n", 31);
|
|
<P>
|
|
<BR> /* The corresponding ioRequest structure would be available as
|
|
<BR> struct ioRequest *ioReq = si->si_value.sival_ptr;
|
|
<BR> and the file descriptor would then be available via
|
|
<BR> ioReq->aiocbp->aio_fildes */
|
|
<BR> }
|
|
}
|
|
<P>
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
<BR> struct ioRequest *ioList;
|
|
<BR> struct aiocb *aiocbList;
|
|
<BR> struct sigaction sa;
|
|
<BR> int s, j;
|
|
<BR> int numReqs; /* Total number of queued I/O requests */
|
|
<BR> int openReqs; /* Number of I/O requests still in progress */
|
|
<P>
|
|
<BR> if (argc < 2) {
|
|
<BR> fprintf(stderr, "Usage: %s <pathname> <pathname>...\n",
|
|
<BR> argv[0]);
|
|
<BR> exit(EXIT_FAILURE);
|
|
<BR> }
|
|
<P>
|
|
<BR> numReqs = argc - 1;
|
|
<P>
|
|
<BR> /* Allocate our arrays */
|
|
<P>
|
|
<BR> ioList = calloc(numReqs, sizeof(struct ioRequest));
|
|
<BR> if (ioList == NULL)
|
|
<BR> errExit("calloc");
|
|
<P>
|
|
<BR> aiocbList = calloc(numReqs, sizeof(struct aiocb));
|
|
<BR> if (aiocbList == NULL)
|
|
<BR> errExit("calloc");
|
|
<P>
|
|
<BR> /* Establish handlers for SIGQUIT and the I/O completion signal */
|
|
<P>
|
|
<BR> sa.sa_flags = SA_RESTART;
|
|
<BR> sigemptyset(&sa.sa_mask);
|
|
<P>
|
|
<BR> sa.sa_handler = quitHandler;
|
|
<BR> if (sigaction(SIGQUIT, &sa, NULL) == -1)
|
|
<BR> errExit("sigaction");
|
|
<P>
|
|
<BR> sa.sa_flags = SA_RESTART | SA_SIGINFO;
|
|
<BR> sa.sa_sigaction = aioSigHandler;
|
|
<BR> if (sigaction(IO_SIGNAL, &sa, NULL) == -1)
|
|
<BR> errExit("sigaction");
|
|
<P>
|
|
<BR> /* Open each file specified on the command line, and queue
|
|
<BR> a read request on the resulting file descriptor */
|
|
<P>
|
|
<BR> for (j = 0; j < numReqs; j++) {
|
|
<BR> ioList[j].reqNum = j;
|
|
<BR> ioList[j].status = EINPROGRESS;
|
|
<BR> ioList[j].aiocbp = &aiocbList[j];
|
|
<P>
|
|
<BR> ioList[j].aiocbp->aio_fildes = open(argv[j + 1], O_RDONLY);
|
|
<BR> if (ioList[j].aiocbp->aio_fildes == -1)
|
|
<BR> errExit("open");
|
|
<BR> printf("opened %s on descriptor %d\n", argv[j + 1],
|
|
<BR> ioList[j].aiocbp->aio_fildes);
|
|
<P>
|
|
<BR> ioList[j].aiocbp->aio_buf = malloc(BUF_SIZE);
|
|
<BR> if (ioList[j].aiocbp->aio_buf == NULL)
|
|
<BR> errExit("malloc");
|
|
<P>
|
|
<BR> ioList[j].aiocbp->aio_nbytes = BUF_SIZE;
|
|
<BR> ioList[j].aiocbp->aio_reqprio = 0;
|
|
<BR> ioList[j].aiocbp->aio_offset = 0;
|
|
<BR> ioList[j].aiocbp->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
|
|
<BR> ioList[j].aiocbp->aio_sigevent.sigev_signo = IO_SIGNAL;
|
|
<BR> ioList[j].aiocbp->aio_sigevent.sigev_value.sival_ptr =
|
|
<BR> &ioList[j];
|
|
<P>
|
|
<BR> s = aio_read(ioList[j].aiocbp);
|
|
<BR> if (s == -1)
|
|
<BR> errExit("aio_read");
|
|
<BR> }
|
|
<P>
|
|
<BR> openReqs = numReqs;
|
|
<P>
|
|
<BR> /* Loop, monitoring status of I/O requests */
|
|
<P>
|
|
<BR> while (openReqs > 0) {
|
|
<BR> <A HREF="/cgi-bin/man/man2html?3+sleep">sleep</A>(3); /* Delay between each monitoring step */
|
|
<P>
|
|
<BR> if (gotSIGQUIT) {
|
|
<P>
|
|
<BR> /* On receipt of SIGQUIT, attempt to cancel each of the
|
|
<BR> outstanding I/O requests, and display status returned
|
|
<BR> from the cancellation requests */
|
|
<P>
|
|
<BR> printf("got SIGQUIT; canceling I/O requests: \n");
|
|
<P>
|
|
<BR> for (j = 0; j < numReqs; j++) {
|
|
<BR> if (ioList[j].status == EINPROGRESS) {
|
|
<BR> printf(" Request %d on descriptor %d:", j,
|
|
<BR> ioList[j].aiocbp->aio_fildes);
|
|
<BR> s = aio_cancel(ioList[j].aiocbp->aio_fildes,
|
|
<BR> ioList[j].aiocbp);
|
|
<BR> if (s == AIO_CANCELED)
|
|
<BR> printf("I/O canceled\n");
|
|
<BR> else if (s == AIO_NOTCANCELED)
|
|
<BR> printf("I/O not canceled\n");
|
|
<BR> else if (s == AIO_ALLDONE)
|
|
<BR> printf("I/O all done\n");
|
|
<BR> else
|
|
<BR> errMsg("aio_cancel");
|
|
<BR> }
|
|
<BR> }
|
|
<P>
|
|
<BR> gotSIGQUIT = 0;
|
|
<BR> }
|
|
<P>
|
|
<BR> /* Check the status of each I/O request that is still
|
|
<BR> in progress */
|
|
<P>
|
|
<BR> printf("aio_error():\n");
|
|
<BR> for (j = 0; j < numReqs; j++) {
|
|
<BR> if (ioList[j].status == EINPROGRESS) {
|
|
<BR> printf(" for request %d (descriptor %d): ",
|
|
<BR> j, ioList[j].aiocbp->aio_fildes);
|
|
<BR> ioList[j].status = aio_error(ioList[j].aiocbp);
|
|
<P>
|
|
<BR> switch (ioList[j].status) {
|
|
<BR> case 0:
|
|
<BR> printf("I/O succeeded\n");
|
|
<BR> break;
|
|
<BR> case EINPROGRESS:
|
|
<BR> printf("In progress\n");
|
|
<BR> break;
|
|
<BR> case ECANCELED:
|
|
<BR> printf("Canceled\n");
|
|
<BR> break;
|
|
<BR> default:
|
|
<BR> errMsg("aio_error");
|
|
<BR> break;
|
|
<BR> }
|
|
<P>
|
|
<BR> if (ioList[j].status != EINPROGRESS)
|
|
<BR> openReqs--;
|
|
<BR> }
|
|
<BR> }
|
|
<BR> }
|
|
<P>
|
|
<BR> printf("All I/O requests completed\n");
|
|
<P>
|
|
<BR> /* Check status return of all I/O requests */
|
|
<P>
|
|
<BR> printf("aio_return():\n");
|
|
<BR> for (j = 0; j < numReqs; j++) {
|
|
<BR> ssize_t s;
|
|
<P>
|
|
<BR> s = aio_return(ioList[j].aiocbp);
|
|
<BR> printf(" for request %d (descriptor %d): %zd\n",
|
|
<BR> j, ioList[j].aiocbp->aio_fildes, s);
|
|
<BR> }
|
|
<P>
|
|
<BR> exit(EXIT_SUCCESS);
|
|
}
|
|
|
|
<A NAME="lbAJ"> </A>
|
|
<H2>SEE ALSO</H2>
|
|
|
|
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_cancel">io_cancel</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_destroy">io_destroy</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_getevents">io_getevents</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_setup">io_setup</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+io_submit">io_submit</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_cancel">aio_cancel</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_error">aio_error</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_init">aio_init</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_read">aio_read</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_return">aio_return</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+aio_write">aio_write</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+lio_listio">lio_listio</A></B>(3)
|
|
|
|
<P>
|
|
|
|
"Asynchronous I/O Support in Linux 2.5",
|
|
Bhattacharya, Pratt, Pulavarty, and Morgan,
|
|
Proceedings of the Linux Symposium, 2003,
|
|
|
|
|
|
<A NAME="lbAK"> </A>
|
|
<H2>COLOPHON</H2>
|
|
|
|
This page is part of release 5.05 of the Linux
|
|
<I>man-pages</I>
|
|
|
|
project.
|
|
A description of the project,
|
|
information about reporting bugs,
|
|
and the latest version of this page,
|
|
can be found at
|
|
<A HREF="https://www.kernel.org/doc/man-pages/.">https://www.kernel.org/doc/man-pages/.</A>
|
|
<P>
|
|
|
|
<HR>
|
|
<A NAME="index"> </A><H2>Index</H2>
|
|
<DL>
|
|
<DT id="18"><A HREF="#lbAB">NAME</A><DD>
|
|
<DT id="19"><A HREF="#lbAC">DESCRIPTION</A><DD>
|
|
<DT id="20"><A HREF="#lbAD">ERRORS</A><DD>
|
|
<DT id="21"><A HREF="#lbAE">VERSIONS</A><DD>
|
|
<DT id="22"><A HREF="#lbAF">CONFORMING TO</A><DD>
|
|
<DT id="23"><A HREF="#lbAG">NOTES</A><DD>
|
|
<DT id="24"><A HREF="#lbAH">EXAMPLE</A><DD>
|
|
<DL>
|
|
<DT id="25"><A HREF="#lbAI">Program source</A><DD>
|
|
</DL>
|
|
<DT id="26"><A HREF="#lbAJ">SEE ALSO</A><DD>
|
|
<DT id="27"><A HREF="#lbAK">COLOPHON</A><DD>
|
|
</DL>
|
|
<HR>
|
|
This document was created by
|
|
<A HREF="/cgi-bin/man/man2html">man2html</A>,
|
|
using the manual pages.<BR>
|
|
Time: 00:06:07 GMT, March 31, 2021
|
|
</BODY>
|
|
</HTML>
|