EN JA
LIO_LISTIO(3)
LIO_LISTIO(3) Linux Programmer's Manual LIO_LISTIO(3)

名前

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 内の NULL ポインタは無視される。

 

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) 参照)。

返り値

modeLIO_NOWAIT の場合、 lio_listio() は全ての操作が正常にキューに入れられた場合に 0 を返す。そうでない場合は、-1 が返り、 errno にエラーを示す値が設定される。
 
modeLIO_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 を超えてしまう状況であった。
EINVAL
mode が不正であるか、 nitems が上限 AIO_LISTIO_MAX を超えている。
EINTR
modeLIO_WAIT で、全ての I/O 操作が完了する前にシグナルが捕捉された (非同期 I/O の完了通知に使用されるシグナルの場合もこれに該当する)。
EIO
aiocb_list で指定された操作の中に失敗したものがあった。アプリケーションは、 aio_return(3) を使用して、個々の操作のステータスを確認することができる。

lio_listio がエラー EAGAIN, EINTR, EIO で失敗した場合、 aiocb_list で指定した操作のいくつかは開始されていることがある。 lio_listio が他の理由で失敗した場合には、どの I/O 操作も開始されていない。

バージョン

The lio_listio() 関数は glibc 2.1 以降で利用できる。

準拠

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 プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2012-05-08