aio_read または aio_read64 サブルーチン

aio_read または aio_read64 サブルーチンには、 POSIX AIO aio_read サブルーチン (IEEE std 1003.1-2001で定義)、および レガシー AIO aio_read サブルーチンの情報が含まれています。

POSIX AIO aio_read サブルーチン

目的

ファイルを非同期で読み取ります。

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include <aio.h>

int aio_read (aiocbp)
struct aiocb *aiocbp;

説明

aio_read サブルーチンは、 aio_fildes に関連したファイルから、 aio_bufが指すバッファーに aio_nbytes を読み取ります。 このサブルーチンは、読み取り要求が開始されるか、ファイルまたは装置のキューに入れられると (データを即時に送信できない場合でも) 戻ります。

aiocbp 値は、処理中の非同期操作のエラー状況と戻り状況をそれぞれ判別するために、 aio_error および aio_return サブルーチンに対する引数として使用することができます。 キューイング中にエラー条件が検出されると、関数呼び出しは、要求を開始またはキューに入れずに戻ります。 要求された操作は、 aio_offset によって指定されたファイル内の絶対位置で行われます。これは、 lseek サブルーチンが aio_offset に等しいオフセットと SEEK_SET に等しい値を持つ操作の直前に呼び出されたかのようになります。 非同期入出力操作をエンキューするための呼び出しが成功した後、ファイルのファイル・オフセットの値は指定されません。

aio_lio_opcode フィールドは、 aio_read サブルーチンによって無視されます。

このファイルに対して優先順位付けされた入出力がサポートされている場合、非同期操作は、プロセスのスケジューリング優先順位から aiocbp->aio_reqprioを引いた優先順位で実行依頼されます。

aiocbp パラメーターは、 aiocb 構造体を指します。 aio_buf が指すバッファーまたは aiocbp が指す制御ブロックが、非同期入出力の完了前に正しくないアドレスになる場合、動作は未定義です。

同じ aiocbp を使用して非同期操作を同時に行うと、未定義の結果が生成されます。

aio_fildesに関連したファイルで同期化された入出力が使用可能になっている場合、このサブルーチンの動作は、同期化された入出力データ保全性の完了および同期化された入出力ファイル保全性の完了の定義に従います。

非同期入出力が未処理の間にプロセス・メモリー・スペースを変更するシステム・アクションの場合、そのアクションの結果は未定義です。

通常のファイルの場合には, オープン・ファイル記述に設定されたオフセット最大値を超えるデータ転送は行われません。

aio_read サブルーチンまたは aio_read64 サブルーチンを、 shm_open サブルーチンの呼び出しから取得したファイル記述子と一緒に使用すると、 EINVALで失敗します。

パラメーター

項目 説明
Aaiocbp (aiocbp) 入出力操作に関連した aiocb 構造体を指します。

aiocb 構造体

aiocb 構造体は、 /usr/include/aio.h ファイルに定義され、以下のメンバーを含んでいます。
int               aio_fildes
off_t             aio_offset
char             *aio_buf
size_t            aio_nbytes
int               aio_reqprio
struct sigevent   aio_sigevent
int               aio_lio_opcode

実行環境

aio_read および aio_read64 サブルーチンは、 プロセス環境 からのみ呼び出すことができます。

戻り値

入出力操作が正常にキューに入れられると、 aio_read サブルーチンは 0 を呼び出しプロセスに戻します。 そうでない場合は-1を返し、エラーを示すグローバル変数errnoをセットする。

エラー・コード

項目 説明
EAGAIN 要求した非同期入出力操作は、システム・リソースの制限が原因でキューに入れられませんでした。

以下の各条件は、 aio_read サブルーチンの呼び出し時に同期的に、または非同期的に検出されます。 以下の条件のいずれかが同期的に検出された場合、aio_readサブルーチンは-1を返し、errnoグローバル変数に対応する値を設定する。 以下の条件のいずれかが非同期的に検出された場合は、非同期操作の 戻り状況は -1 に設定され、非同期操作のエラー状況は、対応する値に設定 されます。

項目 説明
EBADF aio_fildes パラメーターは、読み取り用にオープンされた有効なファイル記述子ではありません。
EINVAL aio_offset によって暗黙指定されたファイル・オフセット値が無効であるか、 aio_reqprio が無効な値であるか、 aio_nbytes が無効な値です。 aio_read または aio_read64 サブルーチンが、 shm_open サブルーチンへの呼び出しから取得されたファイル・ディスクリプターで使用されました。
aio_read サブルーチンが入出力操作を正常にキューに入れられたが、その後操作が取り消されたか、エラーが発生した場合、非同期操作の戻り状況は、通常 read サブルーチンによって戻される値の 1 つです。 さらに、非同期操作のエラー状況は、 read サブルーチンによって通常設定されるエラー状況のいずれか、または以下のいずれかの値に設定されます。
項目 説明
EBADF aio_fildes 引数は、読み取り用にオープンされた有効なファイル記述子ではありません。
ECANCELED 明示的な aio_cancel 要求のために、入出力が完了する前に、要求された入出力が取り消されました。
EINVAL aio_offset によって暗黙指定されたファイル・オフセット値が無効です。
以下の状態は、同期的または非同期的に検出される可能性があります。
項目 説明
EOVERFLOW ファイルが正規のファイルで、 aio_nbytes が 0 より大きく、 aio_offset 内の開始オフセットがファイルの終わりより前で、 aio_fildesに関連したオープン・ファイル記述内のオフセット最大値以上である。

レガシー AIO aio_read サブルーチン

目的: ファイルから非同期に読み取ります。

ライブラリー (レガシー AIO aio_read サブルーチン)

標準 C ライブラリー (libc.a)

構文 (レガシー AIO aio_read サブルーチン)

#include <aio.h>
int aio_read( FileDescriptor,  aiocbp)
int FileDescriptor;
struct aiocb *aiocbp;
int aio_read64( FileDescriptor,  aiocbp)
int FileDescriptor;
struct aiocb64 *aiocbp;

説明 (レガシー AIO aio_read サブルーチン)

aio_read サブルーチンは、ファイルから非同期的に読み取ります。 具体的には、 aio_read サブルーチンは、 FileDescriptor パラメーターに関連したファイルからバッファーに読み取ります。

aio_read64 サブルーチンは、 aiocb64 参照パラメーターを取る aio_read サブルーチンの EXEC に似ています。 これにより、 aio_read64 サブルーチンは、 OFF_MAX (2 ギガバイト-1) を超えるオフセットを指定することができます。

ラージ・ファイル対応プログラミング環境では、 aio_readaio_read64 に再定義されます。

aio_read サブルーチンまたは aio_read64 サブルーチンを、 shm_open サブルーチンの呼び出しから取得したファイル記述子と一緒に使用すると、 EINVALで失敗します。

読み取りの詳細は、 aiocbp パラメーターによって指し示される aiocb 構造体の情報によって提供されます。 この情報には、以下のフィールドが含まれます。

項目 説明
aio_buf 使用するバッファーを示します。
aio_nbytes 読み取るバイト数を示します。

読み取り要求がキューに入れられると、 aio_read サブルーチンは、以下によって指定されたファイル・ポインターを更新します。aio_whenceおよびaio_offsetaiocb 構造体のフィールドは、要求された入出力が既に完了しているかのようになります。 その後、呼び出し側プログラムに戻ります。 このaio_whenceおよびaio_offsetフィールドは、 lseek サブルーチンの whence および offset パラメーターと同じ意味を持ちます。 シークできないファイル・オブジェクトについては、サブルーチンはそれらを無視します。

呼び出し中にエラーが発生した場合、読み取り要求はキューに入れられません。 要求の状況を判別するには、 aio_error サブルーチンを使用します。

入出力操作の完了時に呼び出しプロセスが SIGIO シグナルを受け取るようにするには、AIO_SIGNAL ビットをaio_flagaiocb 構造体のフィールド。

注: aiocb 構造体の イベント 構造体は、現在は使用されていませんが、将来の互換性のために組み込まれています。
注: aio.h を使用して AIO アプリケーションをレガシー AIO 関数定義でコンパイルする場合は、 aio.h で使用される _AIO_AIX_SOURCE マクロを定義する必要があります。 aio.h ファイルを使用したデフォルトのコンパイルは、 POSIX AIO 定義を持つアプリケーション用です。 ソース・ファイルに次のように入力します。
#define _AIO_AIX_SOURCE
#include <sys/aio.h>
または、コンパイル時にコマンド行で次のように入力します。
->xlc ... -D_AIO_AIX_SOURCE ... legacy_aio_program.c 

この時点では優先順位付けされた入出力はサポートされていないため、構造の aio_reqprio フィールドは現在使用されていません。

パラメーター (レガシー AIO aio_read サブルーチン)

項目 説明
FileDescriptor オープンの呼び出しから戻されたものとして読み取られるオブジェクトを識別します。
Aaiocbp (aiocbp) 入出力操作に関連した非同期入出力制御ブロック構造を指します。

aiocb 構造体

aiocb および aiocb64 構造体は、 aio.h ファイルに定義され、以下のメンバーを含んでいます。
struct aiocb
{
       int                 aio_whence;
       off_t               aio_offset;
       char                *aio_buf;
       ssize_t             aio_return;
       int                 aio_errno;
       size_t              aio_nbytes;
       union {
              int          reqprio;
              struct {
                     int   version:8;
                     int   priority:8;
                     int   cache_hint:16;
              } ext;
       } aio_u1;
       int                 aio_flag;
       int                 aio_iocpfd;
       aio_handle_t        aio_handle;
}

#define aio_reqprio        aio_u1.reqprio
#define aio_version        aio_u1.ext.version
#define aio_priority       aio_u1.ext.priority
#define aio_cache_hint     aio_u1.ext.cache_hint

実行環境 (レガシー AIO aio_read サブルーチン)

aio_read および aio_read64 サブルーチンは、プロセス環境からのみ呼び出すことができます。

戻り値 (レガシー AIO aio_read サブルーチン)

読み取り要求が正常にキューに入れられると、 aio_read サブルーチンは値 0 を戻します。 そうでない場合は-1を返し、エラーを識別するためにグローバル変数errnoをセットする。

戻りコードは、以下の errno 値に設定することができます。

項目 説明
EAGAIN 要求をキューに入れるために必要なシステム・リソースが使用できないことを示します。 具体的には、送信キューがいっぱいになっているか、オープンの最大数に達している可能性があります。
EBADF FileDescriptor パラメーターが無効であることを示します。
EFAULT aiocbp パラメーターで指定されたアドレスが無効であることを示します。
EINVAL 以下を示します。aio_whenceフィールドに有効な値がないか, あるいは結果のポインターが正しくありません。 aio_read または aio_read64 サブルーチンが、 shm_open サブルーチンへの呼び出しから取得されたファイル・ディスクリプターで使用されました。

AIO 要求で入出力完了ポートを使用する場合は、戻りコードを以下の errno 値に設定することもできます。

項目 説明
EBADF 以下を示します。aio_iocpfdaiocb 構造体のフィールドが、有効な入出力完了ポート・ファイル記述子ではありません。
EINVAL AIO 要求を開始しようとしたときに、入出力完了ポート・サービスが失敗したことを示します。
EPERM 入出力完了ポート・サービスが使用不可であることを示します。

注: 入出力操作中にエラーが発生した場合、 sys/errno.h ファイルに定義されている他のエラー・コードが aio_error サブルーチンによって戻されることがあります。