lio_listio - リストの I/O
リクエストを開始する
#include <aio.h>
int lio_listio(int mode, struct aiocb *const aiocb_list[],
int nitems, struct sigevent *sevp);
-lrt でリンクする。
lio_listio() 関数は、配列
aiocb_list で指定された I/O
操作の
リストをそれぞれ開始する。
mode
引数には以下のいずれかの値を指定する。
- LIO_WAIT
- 全ての操作が完了するまで、呼び出しは停止
(block) する。 sevp
引数は無視される。
- LIO_NOWAIT
- I/O
操作は処理を行うためのキューに入れられ、呼び出しは直ちに返る。
全ての I/O
操作が完了すると、
sevp
引数で指定した非同期通知が
行われる。詳細は
sigevent(7) を参照。 sevp が
NULL の場合、
非同期通知は行われない。
aiocb_list 引数は、I/O
操作を指定する
aiocb
構造体へのポインター
の配列である。指定された操作の実行順序は規定されていない。
nitems 引数は、配列
aiocb_list
の大きさを指定する。
aiocb_list
内のヌルポインターは無視される。
aiocb_list
の各制御ブロックでは、
aio_lio_opcode
フィールドで開始する
I/O 操作を指定する。
aio_lio_opcode
には以下の値が指定できる。
- LIO_READ
- 読み出し操作を開始する。操作はキューに入れられ、
この制御ブロックを指定して
aio_read(3)
の呼び出しが行われる。
- LIO_WRITE
- 書き込み操作を開始する。操作はキューに入れられ、
この制御ブロックを指定して
aio_write(3)
の呼び出しが行われる。
- LIO_NOP
- この制御ブロックを無視する。
各制御ブロックの残りのフィールドは、
aio_read(3) や
aio_write(3)
の場合と同じ意味を持つ。
各制御ブロックの
aio_sigevent フィールドは、
個々の I/O
操作で通知方法を指定するのに使用される
(
sigevent(7) 参照)。
mode が
LIO_NOWAIT の場合、
lio_listio() は全ての操作が
正常にキューに入れられた場合に
0 を返す。
そうでない場合は、-1
が返り、
errno
にエラーを示す値が設定される。
mode が
LIO_WAIT の場合、
lio_listio() は全ての操作が
正常に完了した場合に
0 を返す。
そうでない場合は、-1
が返り、
errno
にエラーを示す値が設定される。
lio_listio()
の返り値から得られる情報は、関数呼び出し自体に関する
ものだけであり、個々の
I/O
操作に関する情報は得られない。
個々の I/O
操作は失敗することがあるが、これにより他の
I/O 操作が完了
しなくなるといったことはない。
aio_error(3) を使うと、
aiocb_list
の個々の I/O
操作のステータスを知ることができる。
ある I/O
操作が完了すると、その終了ステータスは
aio_return(3) を使う
ことで取得できる。個々の
I/O 操作は
aio_read(3) や
aio_write(3)
に書かれている理由で失敗する場合がある。
lio_listio()
関数は以下の理由で失敗する。
- EAGAIN
- リソースが足りない。
- EAGAIN
-
nitems
で指定された数の I/O
操作を行うと、
非同期 I/O
操作の数が上限 AIO_MAX
を超えてしまう状況であった。
- EINTR
-
mode が LIO_WAIT
で、全ての I/O
操作が完了する前にシグナルが捕捉された。
signal(7) 参照。 (非同期 I/O
の完了通知に使用されるシグナルの場合もこれに該当する)。
- EINVAL
-
mode
が不正であるか、
nitems が上限 AIO_LISTIO_MAX
を超えている。
- EIO
-
aiocb_list
で指定された操作の中に失敗したものがあった。
アプリケーションは、
aio_return(3) を使用して、
個々の操作のステータスを確認することができる。
lio_listio がエラー
EAGAIN,
EINTR,
EIO で失敗した場合、
aiocb_list
で指定した操作のいくつかは開始されていることがある。
lio_listio
が他の理由で失敗した場合には、
どの I/O
操作も開始されていない。
The
lio_listio() 関数は glibc 2.1
以降で利用できる。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
lio_listio() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
使用前に制御ブロックを
0
で埋めるのは良い考えである。
I/O
操作の実行中は制御ブロックを変更してはならない。データの読み書き先
のバッファー領域に I/O
操作の実行中にアクセスしてはならない。さもないと、
どのような結果になるか分からない。また、関係するメモリー領域も有効な状態
のままにしておかなければならない。
同じ
aiocb
構造体を指定して同時に複数の
I/O 操作を行った場合、
どのような結果になるかは不定である。
aio_cancel(3),
aio_error(3),
aio_fsync(3),
aio_return(3),
aio_suspend(3),
aio_write(3),
aio(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。