OSDN Git Service

Retire LDP man-pages repository
[linuxjm/LDP_man-pages.git] / release / man7 / aio.7
diff --git a/release/man7/aio.7 b/release/man7/aio.7
deleted file mode 100644 (file)
index 6e8f247..0000000
+++ /dev/null
@@ -1,428 +0,0 @@
-.\" t
-.\" Copyright (c) 2010 by Michael Kerrisk <mtk.manpages@gmail.com>
-.\"
-.\" %%%LICENSE_START(VERBATIM)
-.\" Permission is granted to make and distribute verbatim copies of this
-.\" manual provided the copyright notice and this permission notice are
-.\" preserved on all copies.
-.\"
-.\" Permission is granted to copy and distribute modified versions of this
-.\" manual under the conditions for verbatim copying, provided that the
-.\" entire resulting derived work is distributed under the terms of a
-.\" permission notice identical to this one.
-.\"
-.\" Since the Linux kernel and libraries are constantly changing, this
-.\" manual page may be incorrect or out-of-date.  The author(s) assume no
-.\" responsibility for errors or omissions, or for damages resulting from
-.\" the use of the information contained herein.  The author(s) may not
-.\" have taken the same level of care in the production of this manual,
-.\" which is licensed free of charge, as they might when working
-.\" professionally.
-.\"
-.\" Formatted or processed versions of this manual, if unaccompanied by
-.\" the source, must acknowledge the copyright and authors of this work.
-.\" %%%LICENSE_END
-.\"
-.\"*******************************************************************
-.\"
-.\" This file was generated with po4a. Translate the source file.
-.\"
-.\"*******************************************************************
-.\"
-.\" Japanese Version Copyright (c) 2012  Akihiro MOTOKI
-.\"         all rights reserved.
-.\" Translated 2012-05-02, Akihiro MOTOKI <amotoki@gmail.com>
-.\"
-.TH AIO 7 2014\-04\-06 Linux "Linux Programmer's Manual"
-.SH 名前
-aio \- POSIX 非同期 I/O の概要
-.SH 説明
-POSIX 非同期 (AIO) インターフェースを使うと、アプリケーションは、非同期
-に (つまり、バックグラウンドで) 実行されるI/O 操作を一つ以上発行できる
-ようになる。アプリケーションは I/O 操作の完了の通知方法を選択することが
-できる。選択できる通知方法は、シグナルの配送、スレッドの起動、通知を行
-わないである。
-
-POSIX AIO インターフェースは以下の関数で構成されている。
-.TP  16
-\fBaio_read\fP(3)
-読み出しリクエストをキューに入れる。
-\fBread\fP(2) の非同期版である。
-.TP 
-\fBaio_write\fP(3)
-書き込みリクエストをキューに入れる。
-\fBwrite\fP(2) の非同期版である。
-.TP 
-\fBaio_fsync\fP(3)
-ファイルディスクリプターに対して行われた I/O 操作の
-同期 (sync) リクエストをキューに入れる。
-\fBfsync\fP(2) や \fBfdatasync\fP(2) の非同期版である。
-.TP 
-\fBaio_error\fP(3)
-キューに入れられた I/O リクエストのエラー状態を取得する。
-.TP 
-\fBaio_return\fP(3)
-完了した I/O リクエストの終了ステータスを取得する。
-.TP 
-\fBaio_suspend\fP(3)
-指定された I/O リクエストの集合 (要素は一つ以上) が完了するまで、
-呼び出し側の実行を停止 (suspend) する。
-.TP 
-\fBaio_cancel\fP(3)
-指定されたファイルディスクリプターに関する
-完了していない I/O リクエストのキャンセルを試みる。
-.TP 
-\fBlio_listio\fP(3)
-一回の関数呼び出しで複数の I/O リクエストをキューに入れる。
-.PP
-\fIaiocb\fP ("非同期 I/O 制御ブロック (asynchronous I/O control block)")
-構造体は、I/O 操作を制御するパラメーターを定義する。この型の引き数は上記
-の全ての関数で使用されている。この構造体は以下の通りである。
-.PP
-.in +4n
-.nf
-#include <aiocb.h>
-
-struct aiocb {
-    /* The order of these fields is implementation\-dependent */
-
-    int             aio_fildes;     /* File descriptor */
-    off_t           aio_offset;     /* File offset */
-    volatile void  *aio_buf;        /* Location of buffer */
-    size_t          aio_nbytes;     /* Length of transfer */
-    int             aio_reqprio;    /* Request priority */
-    struct sigevent aio_sigevent;   /* Notification method */
-    int             aio_lio_opcode; /* Operation to be performed;
-                                       lio_listio() only */
-
-    /* Various implementation\-internal fields not shown */
-};
-
-/* Operation codes for \(aqaio_lio_opcode\(aq: */
-
-enum { LIO_READ, LIO_WRITE, LIO_NOP };
-
-.fi
-.in
-この構造体のフィールドは以下の通りである。
-.TP  16
-\fIaio_filedes\fP
-I/O 操作の実行対象となるファイルディスクリプター。
-.TP 
-\fIaio_offset\fP
-I/O 操作を行うファイルオフセットを示す。
-.TP 
-\fIaio_buf\fP
-読み出し操作、書き込み操作でデータ転送に使用されるバッファー。
-.TP 
-\fIaio_nbytes\fP
-\fIaio_buf\fP が指すバッファーのサイズ。
-.TP 
-\fIaio_reqprio\fP
-このフィールドでは、呼び出したスレッドのリアルタイム優先度から
-減算する値を指定する。この I/O リクエストの実行の優先度を
-決定するために使用される (\fBpthread_setschedparam\fP(3) 参照)。
-指定する値は 0 と \fIsysconf(_SC_AIO_PRIO_DELTA_MAX)\fP が返す値の間で
-なければならない。このフィールドは、ファイル同期操作では無視される。
-.TP 
-\fIaio_sigevent\fP
-このフィールドは、非同期 I/O 操作が完了した際に呼び出し側に
-どのように通知を行うかを指定する構造体である。
-\fIaio_sigevent.sigev_notify\fP に指定できる値は、
-\fBSIGEV_NONE\fP, \fBSIGEV_SIGNAL\fP, \fBSIGEV_THREAD\fP である。
-詳細は \fBsigevent\fP(7) を参照。
-.TP 
-\fIaio_lio_opcode\fP
-実行される操作の種別。
-\fBlio_listio\fP(3) でのみ使用される。
-.PP
-上記のリストにある標準の関数に加えて、GNU C ライブラリでは
-以下に示す POSIX AIO API に対する拡張が提供されている。
-.TP  16
-\fBaio_init\fP(3)
-glibc の POSIX AIO 実装の動作を調整するパラメーターを設定する。
-.SH エラー
-.TP 
-\fBEINVAL\fP
-\fIaiocb\fP 構造体の \fIaio_reqprio\fP フィールドが、0 より小さいか、
-\fIsysconf(_SC_AIO_PRIO_DELTA_MAX)\fP が返す上限よりも大きかった。
-.SH バージョン
-POSIX AIO インターフェイスは glibc バージョン 2.1 以降で提供されている。
-.SH 準拠
-POSIX.1\-2001, POSIX.1\-2008.
-.SH 注意
-使用前に制御ブロックバッファーを 0 で埋めるのはよい考えである
-(\fBmemset\fP(3) 参照)。I/O 操作が実行中の間は、制御ブロックバッファーと
-\fIaio_buf\fP が指すバッファーを変更してはならない。I/O 操作が完了するまで、
-これらのバッファーは有効な状態に保たなければならない。
-
-同じ \fIaiocb\fP 構造体を使って、同時に複数の非同期の読み出し操作や
-書き込み操作を行った場合に、どのような結果になるかは未定義である。
-
-.\" http://lse.sourceforge.net/io/aio.html
-.\" http://lse.sourceforge.net/io/aionotes.txt
-.\" http://lwn.net/Articles/148755/
-現在の Linux では、POSIX AIO 実装は glibc によりユーザー空間で提供
-されている。このため、制限がいくつかあり、最も顕著なものは、I/O 操作を
-実行する複数のスレッドの管理コストが高く、スケーラビリティに欠けること
-である。しばらくの間、カーネルのステートマシンによる非同期 I/O の実装
-の作業が行われているが (\fBio_submit\fP(2), \fBio_setup\fP(2),
-\fBio_cancel\fP(2), \fBio_destroy\fP(2), \fBio_getevents\fP(2) 参照)、
-この実装はまだ POSIX AIO 実装をカーネルシステムコールにより
-再実装するほど成熟したものてはない。
-.SH 例
-下記のプログラムは、コマンドライン引き数で指定された名前のファイルを
-それぞれオープンし、得られたファイルディスクリプターに対するリクエストを
-\fBaio_read\fP(3) を使ってキューに入れる。その後、このプログラムはループに
-入り、定期的に \fBaio_error\fP(3) を使ってまだ実行中の各 I/O 操作を監視す
-る。各 I/O リクエストは、シグナルの配送による完了通知が行われるように設
-定される。全ての I/O リクエストが完了した後、\fBaio_return\fP(3) を使って
-それぞれのステータスを取得する。
-
-\fBSIGQUIT\fP シグナル (control\-\e をタイプすると生成できる) を送ると、
-このプログラムは \fBaio_cancel\fP(3) を使って
-完了していない各リクエストにキャンセル要求を送る。
-
-以下はこのプログラムを実行した際の出力例である。
-この例では、標準入力に対して 2 つのリクエストを行い、
-"abc" と "x" という 2 行の入力を行っている。
-
-.in +4n
-.nf
-$ \fB./a.out /dev/stdin /dev/stdin\fP
-opened /dev/stdin on descriptor 3
-opened /dev/stdin on descriptor 4
-aio_error():
-    for request 0 (descriptor 3): In progress
-    for request 1 (descriptor 4): In progress
-\fBabc\fP
-I/O completion signal received
-aio_error():
-    for request 0 (descriptor 3): I/O succeeded
-    for request 1 (descriptor 4): In progress
-aio_error():
-    for request 1 (descriptor 4): In progress
-\fBx\fP
-I/O completion signal received
-aio_error():
-    for request 1 (descriptor 4): I/O succeeded
-All I/O requests completed
-aio_return():
-    for request 0 (descriptor 3): 4
-    for request 1 (descriptor 4): 2
-.fi
-.in
-.SS プログラムのソース
-\&
-.nf
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <errno.h>
-#include <aio.h>
-#include <signal.h>
-
-#define BUF_SIZE 20     /* Size of buffers for read operations */
-
-#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
-
-#define errMsg(msg)  do { perror(msg); } while (0)
-
-struct ioRequest {      /* Application\-defined structure for tracking
-                           I/O requests */
-    int           reqNum;
-    int           status;
-    struct aiocb *aiocbp;
-};
-
-static volatile sig_atomic_t gotSIGQUIT = 0;
-                        /* On delivery of SIGQUIT, we attempt to
-                           cancel all outstanding I/O requests */
-
-static void             /* Handler for SIGQUIT */
-quitHandler(int sig)
-{
-    gotSIGQUIT = 1;
-}
-
-#define IO_SIGNAL SIGUSR1   /* Signal used to notify I/O completion */
-
-static void                 /* Handler for I/O completion signal */
-aioSigHandler(int sig, siginfo_t *si, void *ucontext)
-{
-    write(STDOUT_FILENO, "I/O completion signal received\en", 31);
-
-    /* The corresponding ioRequest structure would be available as
-           struct ioRequest *ioReq = si\->si_value.sival_ptr;
-       and the file descriptor would then be available via
-           ioReq\->aiocbp\->aio_fildes */
-}
-
-int
-main(int argc, char *argv[])
-{
-    struct ioRequest *ioList;
-    struct aiocb *aiocbList;
-    struct sigaction sa;
-    int s, j;
-    int numReqs;        /* Total number of queued I/O requests */
-    int openReqs;       /* Number of I/O requests still in progress */
-
-    if (argc < 2) {
-        fprintf(stderr, "Usage: %s <pathname> <pathname>...\en",
-                argv[0]);
-        exit(EXIT_FAILURE);
-    }
-
-    numReqs = argc \- 1;
-
-    /* Allocate our arrays */
-
-    ioList = calloc(numReqs, sizeof(struct ioRequest));
-    if (ioList == NULL)
-        errExit("calloc");
-
-    aiocbList = calloc(numReqs, sizeof(struct aiocb));
-    if (aiocbList == NULL)
-        errExit("calloc");
-
-    /* Establish handlers for SIGQUIT and the I/O completion signal */
-
-    sa.sa_flags = SA_RESTART;
-    sigemptyset(&sa.sa_mask);
-
-    sa.sa_handler = quitHandler;
-    if (sigaction(SIGQUIT, &sa, NULL) == \-1)
-        errExit("sigaction");
-
-    sa.sa_flags = SA_RESTART | SA_SIGINFO;
-    sa.sa_sigaction = aioSigHandler;
-    if (sigaction(IO_SIGNAL, &sa, NULL) == \-1)
-        errExit("sigaction");
-
-    /* Open each file specified on the command line, and queue
-       a read request on the resulting file descriptor */
-
-    for (j = 0; j < numReqs; j++) {
-        ioList[j].reqNum = j;
-        ioList[j].status = EINPROGRESS;
-        ioList[j].aiocbp = &aiocbList[j];
-
-        ioList[j].aiocbp\->aio_fildes = open(argv[j + 1], O_RDONLY);
-        if (ioList[j].aiocbp\->aio_fildes == \-1)
-            errExit("open");
-        printf("opened %s on descriptor %d\en", argv[j + 1],
-                ioList[j].aiocbp\->aio_fildes);
-
-        ioList[j].aiocbp\->aio_buf = malloc(BUF_SIZE);
-        if (ioList[j].aiocbp\->aio_buf == NULL)
-            errExit("malloc");
-
-        ioList[j].aiocbp\->aio_nbytes = BUF_SIZE;
-        ioList[j].aiocbp\->aio_reqprio = 0;
-        ioList[j].aiocbp\->aio_offset = 0;
-        ioList[j].aiocbp\->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
-        ioList[j].aiocbp\->aio_sigevent.sigev_signo = IO_SIGNAL;
-        ioList[j].aiocbp\->aio_sigevent.sigev_value.sival_ptr =
-                                &ioList[j];
-
-        s = aio_read(ioList[j].aiocbp);
-        if (s == \-1)
-            errExit("aio_read");
-    }
-
-    openReqs = numReqs;
-
-    /* Loop, monitoring status of I/O requests */
-
-    while (openReqs > 0) {
-        sleep(3);       /* Delay between each monitoring step */
-
-        if (gotSIGQUIT) {
-
-            /* On receipt of SIGQUIT, attempt to cancel each of the
-               outstanding I/O requests, and display status returned
-               from the cancellation requests */
-
-            printf("got SIGQUIT; canceling I/O requests: \en");
-
-            for (j = 0; j < numReqs; j++) {
-                if (ioList[j].status == EINPROGRESS) {
-                    printf("    Request %d on descriptor %d:", j,
-                            ioList[j].aiocbp\->aio_fildes);
-                    s = aio_cancel(ioList[j].aiocbp\->aio_fildes,
-                            ioList[j].aiocbp);
-                    if (s == AIO_CANCELED)
-                        printf("I/O canceled\en");
-                    else if (s == AIO_NOTCANCELED)
-                            printf("I/O not canceled\en");
-                    else if (s == AIO_ALLDONE)
-                        printf("I/O all done\en");
-                    else
-                        errMsg("aio_cancel");
-                }
-            }
-
-            gotSIGQUIT = 0;
-        }
-
-        /* Check the status of each I/O request that is still
-           in progress */
-
-        printf("aio_error():\en");
-        for (j = 0; j < numReqs; j++) {
-            if (ioList[j].status == EINPROGRESS) {
-                printf("    for request %d (descriptor %d): ",
-                        j, ioList[j].aiocbp\->aio_fildes);
-                ioList[j].status = aio_error(ioList[j].aiocbp);
-
-                switch (ioList[j].status) {
-                case 0:
-                    printf("I/O succeeded\en");
-                    break;
-                case EINPROGRESS:
-                    printf("In progress\en");
-                    break;
-                case ECANCELED:
-                    printf("Canceled\en");
-                    break;
-                default:
-                    errMsg("aio_error");
-                    break;
-                }
-
-                if (ioList[j].status != EINPROGRESS)
-                    openReqs\-\-;
-            }
-        }
-    }
-
-    printf("All I/O requests completed\en");
-
-    /* Check status return of all I/O requests */
-
-    printf("aio_return():\en");
-    for (j = 0; j < numReqs; j++) {
-        ssize_t s;
-
-        s = aio_return(ioList[j].aiocbp);
-        printf("    for request %d (descriptor %d): %zd\en",
-                j, ioList[j].aiocbp\->aio_fildes, s);
-    }
-
-    exit(EXIT_SUCCESS);
-}
-.fi
-.SH 関連項目
-.ad l
-.nh
-\fBio_cancel\fP(2), \fBio_destroy\fP(2), \fBio_getevents\fP(2), \fBio_setup\fP(2),
-\fBio_submit\fP(2), \fBaio_cancel\fP(3), \fBaio_error\fP(3), \fBaio_init\fP(3),
-\fBaio_read\fP(3), \fBaio_return\fP(3), \fBaio_write\fP(3), \fBlio_listio\fP(3)
-
-.UR http://www.squid\-cache.org\:/~adrian\:/Reprint\-Pulavarty\-OLS2003.pdf
-.UE
-.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
-である。プロジェクトの説明とバグ報告に関する情報は
-http://www.kernel.org/doc/man\-pages/ に書かれている。