aio_write - 非同期で書き込む
#include <aio.h>
int aio_write(struct aiocb *aiocbp);
-lrt でリンクする。
aio_write() 関数は、
aiocbp
が指すバッファーに記載された
I/O
リクエストをキューに入れる。この関数は
write(2)
の非同期版である。
呼び出し
write(fd, buf, count)
の各引数は
aiocb
が指す構造体の
aio_fildes,
aio_buf,
aio_nbytes に
(この順序で) 対応する (
aiocb 構造体の説明は
aio(7) を参照)。
O_APPEND
が設定されない場合、ファイルオフセットに関係なく、
データは絶対位置
aiocbp->aio_offset
を開始点として書き込まれる。
O_APPEND
が設定されている場合、データはファイルの末尾に、
aio_write()
の呼び出しが行われたのと同じ順序で書き込まれる。この呼び出しの後のファイルオフセットは規定されていない。
「非同期」とは「リクエストがキューに入れられたら、この呼び出しはすぐに返る」
ということである。
呼び出しから戻った時に、書き込みは完了しているかも知れないし、
完了していないかも知れない。
aio_error(3)
を使うことで完了したかをテストできる。
完了した I/O
操作の返り値は
aio_return(3)
で取得できる。
aiocbp->aio_sigevent
を適切に設定することで、
I/O
完了の非同期通知は受けることもできる。詳細は
sigevent(7) を参照。
_POSIX_PRIORITIZED_IO
が定義されていて、
かつファイルがこれをサポートしている場合、
非同期操作は呼び出したプロセスの優先度から
aiocbp->aio_reqprio
を引いた優先度で登録
(submit) される。
フィールド
aiocbp->aio_lio_opcode
は無視される。
最大オフセットを超えた通常のファイルには、何もデータが書き込まれない。
成功した場合、0
が返される。
エラーの場合、リクエストはキューに入れられず、
-1 が返されて、
errno
が適切に設定される。
エラーは後でのみ検知された場合は、
エラーは
aio_return(3) と
aio_error(3)
経由で報告されることになる
(
aio_return(3) は状態 -1
を返し、
aio_error(3)
でエラー状態—
errno
で取得できる
EBADF
のようなエラー状態が返される)。
- EAGAIN
- リソースが足りない。
- EBADF
-
aio_fildes
が書き込みのためにオープンされた有効なファイルディスクリプターではない。
- EFBIG
- ファイルは通常のファイルであり、少なくとも
1
バイトを書き込もうとしている。
しかし開始位置が、このファイルの最大オフセットと同じかそれを超えている。
- EINVAL
-
aio_offset, aio_reqprio, aio_nbytes
のうち 1
つ以上が無効である。
- ENOSYS
-
aio_write()
は実装されていない。
The
aio_write() 関数は glibc 2.1
以降で利用できる。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
aio_write() |
Thread safety |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
使用する前に制御ブロックを
0
にしておくのは、よい考えである。
この制御ブロックは、読み込み操作が進行している間は変更すべきでない。
読み込まれるバッファー領域は
操作の最中にアクセスすべきではない。
さもないと起こる結果が不定になる。
これに含まれるメモリー領域は、有効なままにしなければならない。
同じ
aiocb
構造体を指定して同時に複数の
I/O 操作を行った場合、
どのような結果になるかは不定である。
aio_cancel(3),
aio_error(3),
aio_fsync(3),
aio_read(3),
aio_return(3),
aio_suspend(3),
lio_listio(3),
aio(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。