#, fuzzy msgid "" msgstr "" "Project-Id-Version: man-pages-l10n VERSION\n" "POT-Creation-Date: 2014-07-17 17:57+0900\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: TH #: man-pages/man7/aio.7:26 #, no-wrap msgid "AIO" msgstr "" #. type: TH #: man-pages/man7/aio.7:26 #, no-wrap msgid "2014-04-06" msgstr "" #. type: TH #: man-pages/man7/aio.7:26 #, no-wrap msgid "Linux" msgstr "" #. type: TH #: man-pages/man7/aio.7:26 #, no-wrap msgid "Linux Programmer's Manual" msgstr "" #. type: SH #: man-pages/man7/aio.7:27 #, no-wrap msgid "NAME" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:29 msgid "aio - POSIX asynchronous I/O overview" msgstr "" #. type: SH #: man-pages/man7/aio.7:29 #, no-wrap msgid "DESCRIPTION" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:37 msgid "" "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." msgstr "" #. type: Plain text #: man-pages/man7/aio.7:39 msgid "The POSIX AIO interface consists of the following functions:" msgstr "" #. type: TP #: man-pages/man7/aio.7:39 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:44 msgid "" "Enqueue a read request. This is the asynchronous analog of B(2)." msgstr "" #. type: TP #: man-pages/man7/aio.7:44 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:49 msgid "" "Enqueue a write request. This is the asynchronous analog of B(2)." msgstr "" #. type: TP #: man-pages/man7/aio.7:49 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:56 msgid "" "Enqueue a sync request for the I/O operations on a file descriptor. This is " "the asynchronous analog of B(2) and B(2)." msgstr "" #. type: TP #: man-pages/man7/aio.7:56 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:59 msgid "Obtain the error status of an enqueued I/O request." msgstr "" #. type: TP #: man-pages/man7/aio.7:59 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:62 msgid "Obtain the return status of a completed I/O request." msgstr "" #. type: TP #: man-pages/man7/aio.7:62 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:66 msgid "" "Suspend the caller until one or more of a specified set of I/O requests " "completes." msgstr "" #. type: TP #: man-pages/man7/aio.7:66 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:70 msgid "" "Attempt to cancel outstanding I/O requests on a specified file descriptor." msgstr "" #. type: TP #: man-pages/man7/aio.7:70 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:73 msgid "Enqueue multiple I/O requests using a single function call." msgstr "" #. type: Plain text #: man-pages/man7/aio.7:80 msgid "" "The 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:" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:84 #, no-wrap msgid "#include Eaiocb.hE\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:87 #, no-wrap msgid "" "struct aiocb {\n" " /* The order of these fields is implementation-dependent */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:96 #, no-wrap msgid "" " int aio_fildes; /* File descriptor */\n" " off_t aio_offset; /* File offset */\n" " volatile void *aio_buf; /* Location of buffer */\n" " size_t aio_nbytes; /* Length of transfer */\n" " int aio_reqprio; /* Request priority */\n" " struct sigevent aio_sigevent; /* Notification method */\n" " int aio_lio_opcode; /* Operation to be performed;\n" " lio_listio() only */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:99 #, no-wrap msgid " /* Various implementation-internal fields not shown */\n" "};\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:101 #, no-wrap msgid "/* Operation codes for \\(aqaio_lio_opcode\\(aq: */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:103 #, no-wrap msgid "enum { LIO_READ, LIO_WRITE, LIO_NOP };\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:107 msgid "The fields of this structure are as follows:" msgstr "" #. type: TP #: man-pages/man7/aio.7:107 #, no-wrap msgid "I" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:110 msgid "The file descriptor on which the I/O operation is to be performed." msgstr "" #. type: TP #: man-pages/man7/aio.7:110 #, no-wrap msgid "I" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:113 msgid "This is the file offset at which the I/O operation is to be performed." msgstr "" #. type: TP #: man-pages/man7/aio.7:113 #, no-wrap msgid "I" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:116 msgid "" "This is the buffer used to transfer data for a read or write operation." msgstr "" #. type: TP #: man-pages/man7/aio.7:116 #, no-wrap msgid "I" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:120 msgid "This is the size of the buffer pointed to by I." msgstr "" #. type: TP #: man-pages/man7/aio.7:120 #, no-wrap msgid "I" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:129 msgid "" "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(3)). The specified value must be " "between 0 and the value returned by I. " "This field is ignored for file synchronization operations." msgstr "" #. type: TP #: man-pages/man7/aio.7:129 #, no-wrap msgid "I" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:143 msgid "" "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 are B, B, and " "B. See B(7) for further details." msgstr "" #. type: TP #: man-pages/man7/aio.7:143 #, no-wrap msgid "I" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:147 msgid "The type of operation to be performed; used only for B(3)." msgstr "" #. type: Plain text #: man-pages/man7/aio.7:150 msgid "" "In addition to the standard functions listed above, the GNU C library " "provides the following extension to the POSIX AIO API:" msgstr "" #. type: TP #: man-pages/man7/aio.7:150 #, no-wrap msgid "B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:153 msgid "" "Set parameters for tuning the behavior of the glibc POSIX AIO implementation." "" msgstr "" #. type: SH #: man-pages/man7/aio.7:153 #, no-wrap msgid "ERRORS" msgstr "" #. type: TP #: man-pages/man7/aio.7:154 #, no-wrap msgid "B" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:163 msgid "" "The I field of the I structure was less than 0, or was " "greater than the limit returned by the call " "I." msgstr "" #. type: SH #: man-pages/man7/aio.7:163 #, no-wrap msgid "VERSIONS" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:165 msgid "The POSIX AIO interfaces are provided by glibc since version 2.1." msgstr "" #. type: SH #: man-pages/man7/aio.7:165 #, no-wrap msgid "CONFORMING TO" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:167 msgid "POSIX.1-2001, POSIX.1-2008." msgstr "" #. type: SH #: man-pages/man7/aio.7:167 #, no-wrap msgid "NOTES" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:174 msgid "" "It is a good idea to zero out the control block buffer before use (see " "B(3)). The control block buffer and the buffer pointed to by " "I must not be changed while the I/O operation is in progress. " "These buffers must remain valid until the I/O operation completes." msgstr "" #. type: Plain text #: man-pages/man7/aio.7:178 msgid "" "Simultaneous asynchronous read or write operations using the same I " "structure yield undefined results." msgstr "" #. http://lse.sourceforge.net/io/aio.html #. http://lse.sourceforge.net/io/aionotes.txt #. http://lwn.net/Articles/148755/ #. type: Plain text #: man-pages/man7/aio.7:196 msgid "" "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(2), B(2), " "B(2), B(2), 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." "" msgstr "" #. type: SH #: man-pages/man7/aio.7:196 #, no-wrap msgid "EXAMPLE" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:209 msgid "" "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(3). The program then loops, periodically monitoring each of the " "I/O operations that is still in progress using 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(3)." msgstr "" #. type: Plain text #: man-pages/man7/aio.7:215 msgid "" "The B signal (generated by typing control-\\e) causes the program " "to request cancellation of each of the outstanding requests using " "B(3)." msgstr "" #. type: Plain text #: man-pages/man7/aio.7:220 msgid "" "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\"." msgstr "" #. type: Plain text #: man-pages/man7/aio.7:244 #, no-wrap msgid "" "$ B<./a.out /dev/stdin /dev/stdin>\n" "opened /dev/stdin on descriptor 3\n" "opened /dev/stdin on descriptor 4\n" "aio_error():\n" " for request 0 (descriptor 3): In progress\n" " for request 1 (descriptor 4): In progress\n" "B\n" "I/O completion signal received\n" "aio_error():\n" " for request 0 (descriptor 3): I/O succeeded\n" " for request 1 (descriptor 4): In progress\n" "aio_error():\n" " for request 1 (descriptor 4): In progress\n" "B\n" "I/O completion signal received\n" "aio_error():\n" " for request 1 (descriptor 4): I/O succeeded\n" "All I/O requests completed\n" "aio_return():\n" " for request 0 (descriptor 3): 4\n" " for request 1 (descriptor 4): 2\n" msgstr "" #. type: SS #: man-pages/man7/aio.7:246 #, no-wrap msgid "Program source" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:255 #, no-wrap msgid "" "#include Estdlib.hE\n" "#include Eunistd.hE\n" "#include Estdio.hE\n" "#include Eerrno.hE\n" "#include Eaio.hE\n" "#include Esignal.hE\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:257 #, no-wrap msgid "#define BUF_SIZE 20 /* Size of buffers for read operations */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:259 #, no-wrap msgid "" "#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:261 #, no-wrap msgid "#define errMsg(msg) do { perror(msg); } while (0)\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:268 #, no-wrap msgid "" "struct ioRequest { /* Application-defined structure for tracking\n" " I/O requests */\n" " int reqNum;\n" " int status;\n" " struct aiocb *aiocbp;\n" "};\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:272 #, no-wrap msgid "" "static volatile sig_atomic_t gotSIGQUIT = 0;\n" " /* On delivery of SIGQUIT, we attempt to\n" " cancel all outstanding I/O requests */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:278 #, no-wrap msgid "" "static void /* Handler for SIGQUIT */\n" "quitHandler(int sig)\n" "{\n" " gotSIGQUIT = 1;\n" "}\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:280 #, no-wrap msgid "" "#define IO_SIGNAL SIGUSR1 /* Signal used to notify I/O completion */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:285 #, no-wrap msgid "" "static void /* Handler for I/O completion signal */\n" "aioSigHandler(int sig, siginfo_t *si, void *ucontext)\n" "{\n" " write(STDOUT_FILENO, \"I/O completion signal received\\en\", 31);\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:291 #, no-wrap msgid "" " /* The corresponding ioRequest structure would be available as\n" " struct ioRequest *ioReq = si-Esi_value.sival_ptr;\n" " and the file descriptor would then be available via\n" " ioReq-Eaiocbp-Eaio_fildes */\n" "}\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:301 #, no-wrap msgid "" "int\n" "main(int argc, char *argv[])\n" "{\n" " struct ioRequest *ioList;\n" " struct aiocb *aiocbList;\n" " struct sigaction sa;\n" " int s, j;\n" " int numReqs; /* Total number of queued I/O requests */\n" " int openReqs; /* Number of I/O requests still in progress */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:307 #, no-wrap msgid "" " if (argc E 2) {\n" " fprintf(stderr, \"Usage: %s EpathnameE EpathnameE..." "\\en\",\n" " argv[0]);\n" " exit(EXIT_FAILURE);\n" " }\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:309 #, no-wrap msgid " numReqs = argc - 1;\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:311 #, no-wrap msgid " /* Allocate our arrays */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:315 #, no-wrap msgid "" " ioList = calloc(numReqs, sizeof(struct ioRequest));\n" " if (ioList == NULL)\n" " errExit(\"calloc\");\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:319 #, no-wrap msgid "" " aiocbList = calloc(numReqs, sizeof(struct aiocb));\n" " if (aiocbList == NULL)\n" " errExit(\"calloc\");\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:321 #, no-wrap msgid "" " /* Establish handlers for SIGQUIT and the I/O completion signal */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:324 #, no-wrap msgid " sa.sa_flags = SA_RESTART;\n" " sigemptyset(&sa.sa_mask);\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:328 #, no-wrap msgid "" " sa.sa_handler = quitHandler;\n" " if (sigaction(SIGQUIT, &sa, NULL) == -1)\n" " errExit(\"sigaction\");\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:333 #, no-wrap msgid "" " sa.sa_flags = SA_RESTART | SA_SIGINFO;\n" " sa.sa_sigaction = aioSigHandler;\n" " if (sigaction(IO_SIGNAL, &sa, NULL) == -1)\n" " errExit(\"sigaction\");\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:336 #, no-wrap msgid "" " /* Open each file specified on the command line, and queue\n" " a read request on the resulting file descriptor */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:341 #, no-wrap msgid "" " for (j = 0; j E numReqs; j++) {\n" " ioList[j].reqNum = j;\n" " ioList[j].status = EINPROGRESS;\n" " ioList[j].aiocbp = &aiocbList[j];\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:347 #, no-wrap msgid "" " ioList[j].aiocbp-Eaio_fildes = open(argv[j + 1], O_RDONLY);\n" " if (ioList[j].aiocbp-Eaio_fildes == -1)\n" " errExit(\"open\");\n" " printf(\"opened %s on descriptor %d\\en\", argv[j + 1],\n" " ioList[j].aiocbp-Eaio_fildes);\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:351 #, no-wrap msgid "" " ioList[j].aiocbp-Eaio_buf = malloc(BUF_SIZE);\n" " if (ioList[j].aiocbp-Eaio_buf == NULL)\n" " errExit(\"malloc\");\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:359 #, no-wrap msgid "" " ioList[j].aiocbp-Eaio_nbytes = BUF_SIZE;\n" " ioList[j].aiocbp-Eaio_reqprio = 0;\n" " ioList[j].aiocbp-Eaio_offset = 0;\n" " ioList[j].aiocbp-Eaio_sigevent.sigev_notify = SIGEV_SIGNAL;\n" " ioList[j].aiocbp-Eaio_sigevent.sigev_signo = IO_SIGNAL;\n" " ioList[j].aiocbp-Eaio_sigevent.sigev_value.sival_ptr =\n" " &ioList[j];\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:364 #, no-wrap msgid "" " s = aio_read(ioList[j].aiocbp);\n" " if (s == -1)\n" " errExit(\"aio_read\");\n" " }\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:366 #, no-wrap msgid " openReqs = numReqs;\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:368 #, no-wrap msgid " /* Loop, monitoring status of I/O requests */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:371 #, no-wrap msgid "" " while (openReqs E 0) {\n" " sleep(3); /* Delay between each monitoring step */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:373 #, no-wrap msgid " if (gotSIGQUIT) {\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:377 #, no-wrap msgid "" " /* On receipt of SIGQUIT, attempt to cancel each of the\n" " outstanding I/O requests, and display status returned\n" " from the cancellation requests */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:379 #, no-wrap msgid " printf(\"got SIGQUIT; canceling I/O requests: \\en\");\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:396 #, no-wrap msgid "" " for (j = 0; j E numReqs; j++) {\n" " if (ioList[j].status == EINPROGRESS) {\n" " printf(\" Request %d on descriptor %d:\", j,\n" " ioList[j].aiocbp-Eaio_fildes);\n" " s = aio_cancel(ioList[j].aiocbp-Eaio_fildes,\n" " ioList[j].aiocbp);\n" " if (s == AIO_CANCELED)\n" " printf(\"I/O canceled\\en\");\n" " else if (s == AIO_NOTCANCELED)\n" " printf(\"I/O not canceled\\en\");\n" " else if (s == AIO_ALLDONE)\n" " printf(\"I/O all done\\en\");\n" " else\n" " errMsg(\"aio_cancel\");\n" " }\n" " }\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:399 #, no-wrap msgid " gotSIGQUIT = 0;\n" " }\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:402 #, no-wrap msgid "" " /* Check the status of each I/O request that is still\n" " in progress */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:409 #, no-wrap msgid "" " printf(\"aio_error():\\en\");\n" " for (j = 0; j E numReqs; j++) {\n" " if (ioList[j].status == EINPROGRESS) {\n" " printf(\" for request %d (descriptor %d): \",\n" " j, ioList[j].aiocbp-Eaio_fildes);\n" " ioList[j].status = aio_error(ioList[j].aiocbp);\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:424 #, no-wrap msgid "" " switch (ioList[j].status) {\n" " case 0:\n" " printf(\"I/O succeeded\\en\");\n" " break;\n" " case EINPROGRESS:\n" " printf(\"In progress\\en\");\n" " break;\n" " case ECANCELED:\n" " printf(\"Canceled\\en\");\n" " break;\n" " default:\n" " errMsg(\"aio_error\");\n" " break;\n" " }\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:430 #, no-wrap msgid "" " if (ioList[j].status != EINPROGRESS)\n" " openReqs--;\n" " }\n" " }\n" " }\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:432 #, no-wrap msgid " printf(\"All I/O requests completed\\en\");\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:434 #, no-wrap msgid " /* Check status return of all I/O requests */\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:438 #, no-wrap msgid "" " printf(\"aio_return():\\en\");\n" " for (j = 0; j E numReqs; j++) {\n" " ssize_t s;\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:443 #, no-wrap msgid "" " s = aio_return(ioList[j].aiocbp);\n" " printf(\" for request %d (descriptor %d): %zd\\en\",\n" " j, ioList[j].aiocbp-Eaio_fildes, s);\n" " }\n" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:446 #, no-wrap msgid " exit(EXIT_SUCCESS);\n" "}\n" msgstr "" #. type: SH #: man-pages/man7/aio.7:447 #, no-wrap msgid "SEE ALSO" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:462 msgid "" "B(2), B(2), B(2), B(2), " "B(2), B(3), B(3), B(3), " "B(3), B(3), B(3), B(3)" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:465 msgid "" "E<.UR http://www.squid-cache.org\\:/~adrian\\:/Reprint-Pulavarty-OLS2003." "pdf> E<.UE>" msgstr "" #. type: SH #: man-pages/man7/aio.7:465 #, no-wrap msgid "COLOPHON" msgstr "" #. type: Plain text #: man-pages/man7/aio.7:473 msgid "" "This page is part of release 3.70 of the Linux I project. A " "description of the project, information about reporting bugs, and the latest " "version of this page, can be found at \\%http://www.kernel.org/doc/man-pages/" "." msgstr ""