標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
Single UNIX Specification、バージョン 2 |
両方 | OS/390 V2R7 |
#define _XOPEN_SOURCE 500
#include <aio.h>
int aio_write(struct aiocb *aiocbp);
aio_write() 関数は、aiocb 構造体 (非同期入出力制御 ブロック) によって記述された非同期書き込みを開始します。
この操作では、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 を呼び出しプロセスに戻します。