aio_suspend() - 非同期入出力要求の待機

標準

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

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

両方

OS/390 V2R7

形式

#define _XOPEN_SOURCE 500
#include <aio.h>

int aio_suspend(const struct aiocb *const list[],
                int nent, const struct timespec *timeout);

機能説明

list 引数で参照される非同期入出力操作のうちの 少なくとも 1 つが完了するまで、またはシグナルによりこの関数が割り込まれる まで、aio_suspend() 関数は、timeout が NULL ポインターのときに 呼び出し元スレッドを中断します。あるいは、timeout が NULL でない場合、timeout で 指定した時間間隔が経過するまで、そのスレッドは中断されます。list で参照されるいずれかの入出力操作よりも前 に、timeout が指す timespec 構造体に指定した時間間隔 が経過すると、aio_suspend() は、エラーを出して戻ります。呼び出しの時点でリスト内の aoicb 構造体のいずれかが、完了 した非同期入出力操作に対応する (つまり、操作のエラー状況 が EINPROGRESS ではない) 場合、この関数は、呼び出し元スレッド を中断することなく戻ります。

list 引数は、非同期入出力制御ブロック (AIOCB) を指す ポインターの配列です。nent 引数は、配列内のエレメントの数を指示します。ポインターが指す各 aiocb 構造体は、非同期入出力要求を開始 するときに使用されることになります。この配列に NULL ポインターが含まれることがありますが、それは 無視されます。非同期入出力を実行依頼するときに使用 されなかった aiocb 構造体、または無効な aiocb 構造体 を参照するポインターがこの配列に含まれていると、結果は予測できなく なります。

戻り値

正常に実行された場合、aio_suspend() は、0 を戻します。

正常に実行されなかった場合は、aio_suspend() は、-1 を戻します。aio_error() または aio_return() を使用して、関連するエラー状況と戻り状況をそれぞれ走査することにより、どの非同期入出力が完了したかをアプリケーションが判別できます。aio_suspend() は、errno を次のいずれかの値に設定します。
エラー・コード
説明
EAGAIN
list で参照されるリストに指定した非同期入出力 は、timeout で指定した時間間隔以内に完了しませんでした。
EINTR
シグナルにより aio_suspend 関数が割り込まれました。各非同期入出力操作は、その完了時にシグナルを発生させる可能性があるため に、待機されている 1 つ以上の入出力走査自体が完了するとエラー が戻される場合があります。
ENOSYS
z/OS® UNIX System Services が、aio_suspend() 関数をサポートしていません。

使用上の注意

  1. AIOCB ポインターのリストで表される AIOCB は、aio_suspend の 呼び出し元のキーと同じストレージ・キーの中に存在しなければなりません。AIOCB ポインター・リストまたはリストで表される AIOCB のいずれかに 呼び出し元がアクセスできないと、EFAULT になる場合があります。
  2. 値が 0 のリスト内の AIOCB ポインターは無視されます。
  3. タイムアウト値 0 (秒 + ナノ秒) は、aio_suspend() 呼び出しでまったく 要求の待機が行われないことを意味します。この呼び出しでは、完了した非同期入出力要求について調べられます。そのような要求が見つからないと、この関数は EAGAIN により戻ります。そのような要求が少なくとも 1 つ見つかると、aio_suspend() は成功して戻ります。
  4. <limits.h> に定義されている、tv_sec フィールドが INT_MAX で 設定された timespec のタイムアウト値では、非同期入出力要求が 完了するかまたはシグナルが受信されるまで、aio_suspend サービスが待つ 結果となります。

    マクロ _AIO_OS390 が定義されている場合、以下の事項も該当する ことがあります。

  5. 非同期入出力の呼び出しのために、アプリケーション提供のイベント制御ブロック (ECB) ポインターを使用する AIOCB を指すポインターの数は、253 までに制限されています。_AIO_OS390 フィーチャー・テスト・マクロを使用しないときは、制限を受けません。 ユーザー定義の ECB を AIOCB データ域に提供する方法については、BPX1AIO の下 の「z/OS UNIX System Services プログラミング: アセンブラー呼び出し可能サービス 解説書」を参照してください。
  6. aio_suspend() に渡される AIOCB は、当該サービスがまだ進行中である ときにプロセス内の他のスレッドによって解放されたり再使用されたりしては なりません。非同期入出力が完了した後でも、当該サービスが AIOCB を使用する ことがあります。この制約により、複数のスレッドが同じ AIOCB に関する aio_suspend() を同時に実行することがなくなります。aio_suspend() の途中で AIOCB を変更すると、予測できない結果が 生じます。
  7. これらの拡張機能を使用するには、SYS1.CSSLIB のマクロが必要です。コンパイル時に SYS1.CSSLIB が SYSLIB 連結に組み込まれることを 確認してください。

関連情報