aio_write() - ソケットへの非同期書き込み

標準

標準/拡張機能 C/C++ 依存項目

Single UNIX Specification、バージョン 2
Single UNIX Specification、バージョン 3

両方

OS/390 V2R7

形式

#define _XOPEN_SOURCE 500
#include <aio.h>

int aio_write(struct aiocb *aiocbp);

機能説明

aio_write() 関数は、aiocb 構造体 (非同期入出力制御 ブロック) によって記述された非同期書き込みを開始します。

aiocbp 引数は、aiocb 構造体を指します。この構造体には以下のメンバーが含まれています。
aio_fildes
ファイル記述子
aio_offset
ファイル・オフセット
aio_buf
バッファーの位置
aio_nbytes
転送の長さ
aio_reqprio
要求優先順位オフセット
aio_sigevent
シグナルの番号と値
aio_lio_opcode
実行される操作

この操作では、aio_buf が指すバッファー から aio_fildes に関連したソケットまたはファイル に、aio_nbytes の書き込みが行われます。ファイルまたは装置に対して要求が開始されたかキューに入れられる と (データを即時に送達できないときでも)、aio_write() の呼び出しは 戻ります。

現在、非同期入出力は、ソケットについてだけサポートされています。aio_offset フィールドは、設定しても無視されます。

非同期操作のエラー状況と戻り状況をそれぞれ判別するため の aio_error() 関数と aio_return() 関数に対する引数と して、aiocbp 値を使用できます。操作の進行中に aio_error() で検索されるエラー状況 は EINPROGRESS ですが、aio_return() で検索される 戻り状況は予測できません。

エラー条件がキューイングの途中で検出されると、要求の開始または キューイングを完了することなく、関数呼び出しは戻ります。

操作が非同期的に完了するとき、プログラム は、aio_sigevent 構造体に指定されたシグナルによって通知を 受けることができます。sigwaitinfo() または sigtimedwait() の付いているこの通知を受けるほうが、それらにシグナル・ハンドラーをドライブさせるより著しく効率的です。この時点では、戻り状況とエラー状況は、操作の結果を反映するよう 更新されています。sigevent 構造体の通知関数のフィールドは、サポートされていません。シグナルが不要な場合、プログラムは、結果 が EINPROGRESS ではなくなるまで、aio_error() に よって aiocb を時々ポーリングすることができます。

制御が aio_read() の呼び出しから戻る前に操作が完了して、シグナル・ハンドラーが送達される場合があるので注意してください。 操作により実際にこの呼び出しが迅速に完了されたときでも、aio_read() の 呼び出しからの戻り値は 0 になり、入出力自体の結果ではない 入出力要求のキューイングが反映されます。

非同期操作は、完了する前に aio_cancel() によって取り消される場合が あります。取り消された操作は、ECANCELED というエラー状況で終了 し、指定されたシグナルが送達されます。しかし、タイミング上の理由により、aio_cancel() で取り消される前 に、操作が自然に正常終了または異常終了する場合もあります。

この操作のファイル記述子がクローズされると、操作が完了しなかったか または完了する直前でない場合には、操作は削除されます。削除される操作について指定されたシグナルは送達されません。Close() は、その記述子に対応する進行中の非同期操作が削除されるか または完了するまで待ちます。

aio_suspend() を使用して、非同期操作が完了するまで待つことも できます。

ソケットは、ブロック状態でなければなりません。ブロック状態でないと、操作が EWOULDBLOCK により失敗することがあります。

非同期入出力が完了する前に、aiocbp が指す制御ブロック または aio_buf が指すバッファーが不当なアドレスになる と、aio_read() の動作は予測できなくなります。

入出力が完了する前に、aio_read() 要求を作成するスレッドが終了した 場合でも、aiocb 構造体は、戻り状況とエラー状況によって更新 され、スレッドが実行されていたプロセスに、指定されたシグナルが送達 されます。スレッドに関連したストレージがその要求に関して使用された場合、結果は まったく予測できません。

同じ aiocbp を使用する同時非同期操作、無効 な aiocbp を使用する非同期操作の試行、またはプロセスの メモリー・スペースのアドレス範囲に対する非同期入出力が未解決である間にその スペースを変更するシステム処置では、予測できない結果が生じます。

同じストリーム・ソケット上で aio_write() の同時操作はしないでください。データがネットワーク上で順が狂って送信されることがあります。UDP ソケットを使用するとそれぞれの aio_write は単一のデータグラムを定義しますが、UDP への到着に関しての暗黙の順序はありません。しかしながら、過多のデータグラムを送信しないようにしてください。 ネットワーク輻輳が発生したり、または受信側が遅いと管理されていない aio_writes の付いた膨大なシステム・ストレージを拘束することになり、最終的には ENOBUFS で失敗します。

非同期 accept()、非同期 accept_and_recv()、すべての 5 つのペアの読み取りおよび書き込み型操作の非同期フォーム、および ECB 経由、出口プログラム経由、またはメッセージ・キュー経由の入出力完了通知の受け取り、などの BPX1AIO 呼び出し可能サービスで使用可能な非同期入出力に対する、いくつかのソケット指向拡張機能があります。 <aio.h> ヘッダーは、C プログラムから BPX1AIO を使用するのに必要な、すべての構造体フィールド、定数、およびプロトタイプを含んでいます。 これらの拡張機能は _AIO_OS390 フィーチャー・テスト・マクロが定義された場合に公開されます。 BPX1AIO スタブは、 SYS1.CSSLIB に常駐しており、ユーザー・プログラムにバウンドしている必要があります。 非同期入出力サービスについての詳細記述は、「z/OS UNIX System Services プログラミング: アセンブラー呼び出し可能サービス 解説書」の BPX1AIO を参照してください。

aio_lio_opcode フィールドは、関数 aio_write() に よって LIO_WRITE に設定されます。

_POSIX_PRIORITIZED_IO はサポートされていません。aio_reqprio フィールドは、設定しても無視されます。

_POSIX-SYNCHRONIZED_IO はサポートされていません。

戻り値

入出力操作が正常にキューに入れられた場合、aio_write() は 0 を呼び出しプロセスに戻します。

入出力操作がキューに入れられない場合は、aio_write() は -1 を戻し、errno を 以下のいずれかの値に設定します。
エラー・コード
説明
EAGAIN
要求した非同期入出力操作は、システム・リソースの制限が原因でキューに入れられませんでした。
ENOSYS
aio_fildes に関連したファイルは、aio_write() 関数を サポートしません。
以下の条件のそれぞれは、aio_write() の呼び出しの時点で同期的に 検出される場合も、非同期的に検出される場合もあります。以下の条件のいずれかが同期的に検出された場合、aio_write() は -1 を戻し、errno を 対応する値に設定します。以下の条件のいずれかが非同期的に検出された場合は、非同期操作の 戻り状況は -1 に設定され、非同期操作のエラー状況は、対応する値に設定 されます。
エラー・コード
説明
EBADF
aio_fildes 引数は、書き込み用にオープンされた有効な ファイル記述子ではありません。
EINVAL
aio_nbytes が無効値であるか、または aio_sigevent に無効値が入っています。
EWOULDBLOCK
aio_fildes に関連したファイルは非ブロック状態であり、データが使用可能ではありません。
aio_write() は、入出力操作を正常にキューに入れたが、その操作が その後取り消されたか、またはエラーが検出された場合、非同期操作の 戻り状況は、-1 に設定されます。また、非同期操作のエラー状況 は、write() 関数呼び出しで通常設定されるエラー状況に設定 されるか、あるいは次の値に設定されます。
エラー・コード
説明
ECANCELED
要求した入出力は、aio_cancel() を明示的に呼び出したために入出力 が完了する前に取り消されました。

関連情報