システムインタフェース

Solaris 非同期入出力

通知 (SIGIO)

非同期入出力呼び出しが正常に復帰しても、入出力操作は待ち行列に並べられただけであり、実行を待っています。実際の操作は、戻り値と潜在的なエラー識別子も持っています。これらの値は、同期呼び出しの結果として呼び出し側に戻されます。入出力が終了すると、戻り値とエラー値は、要求時点でユーザが aio_result_t へのポインタとして指定した位置に格納されます。aio_result_t 構造体は、<sys/asynch.h> に次のように定義されています。


typedef struct aio_result_t {
 	ssize_t	aio_return; /* 読み取りまたは書き込みの戻り値 */
 	int 		aio_errno;  /* 入出力によって生成されたエラー番号 */
 } aio_result_t;

aio_result_t が変更されると、入出力要求を行なったプロセスに SIGIO シグナルが配信されます。

2 つ以上の非同期入出力操作を保留状態にしている場合、どの要求によって SIGIO シグナルが生じたか、またはどちらの要求によって SIGIO シグナルが生じたのかは調べることはできません。SIGIO を受け取ったプロセスは、SIGIO を生じた原因となる条件をすべてチェックしなければなりません。

aioread(3AIO)

aioread(3AIO)read(2) の非同期版です。aioread(3AIO) は通常の読み取り引数に加えて、ファイル位置と、システムが操作結果を格納する aio_result_t 構造体のアドレスを指定する引数を取ります。ファイル位置には、操作前にファイル内で行うシークを指定します。aioread(3AIO) 呼び出しが成功したか失敗したかに関係なく、ファイルポインタが更新されます。

aiowrite(3AIO)

aiowrite(3AIO) 関数は write(2) の非同期版です。aiowrite(3AIO) は通常の書き込み引数以外にファイル位置と、操作結果が格納される aio_result_t 構造体のアドレスを指定する引数を取ります。

ファイル位置には、操作の前にファイル内で行うシークを指定します。aiowrite(3AIO) 呼び出しが成功すると、ファイルポインタはシークと書き込みが成功した場合の位置に変更されます。ファイルポインタは書き込みを行なった後、以降の書き込みができなくなった場合も変更されます。

aiocancel(3AIO)

aiocancel(3AIO) は、その aio_result_t 構造体を引数として指定した非同期要求の取り消しを試みます。aiocancel(3AIO) 呼び出しは、要求がまだ待ち行列にある場合だけに成功します。操作がすでに進行していると aiocancel(3AIO) は失敗します。

aiowait(3AIO)

aiowait(3AIO) を呼び出すと、少なくとも 1 つの未処理の非同期入出力操作が完了するまで呼び出しプロセスはブロッキングされます。タイムアウトパラメタは、入出力の完了を待つ最大インタバルを指します。0 のタイムアウト値は、待つ必要がないことを指定します。aiowait(3AIO) は、完了した操作の aio_result_t 構造体へのポインタを戻します。

poll(2)

非同期の入出力イベントの完了を、SIGIO 割り込みに依存するのではなく同期的に決定するには、poll(2) を使用してください。SIGIO 割り込みの原因を調べるためにポーリングすることもできます。

poll(2) をあまり多くのファイルで使用すると、処理が遅くなります。この問題は、poll(7D) で解決します。

poll(7D)

/dev/poll によって、多数のファイル記述子のポーリングを非常にスケーラブルに行うことができます。これは、新しい API のセットと新しいドライバである /dev/poll によって可能になっています。/dev/poll API は poll(2) の代替ではなく、選択して使用するものです。poll(7D)/dev/poll API の詳細と例を示しています。適切に使用すると、/dev/poll API は poll(2) よりも適切にスケールが行われます。特に次の条件を満たすアプリケーションに適します。

close(2)

ファイルは、close(2) 呼び出しによって閉じられます。close(2) を呼び出すと、取り消すことができる未処理の非同期入出力要求はすべて取り消されます。close(2) 関数は、取り消せない操作の完了を待ちます (詳細は、aiocancel(3AIO)を参照してください)。close(2) 呼び出しが戻ると、そのファイル記述子について保留状態にある非同期入出力要求はなくなります。ファイルが閉じられると、取り消されるのは指定したファイル記述子に対する待ち行列内にある非同期入出力要求だけです。他のファイル記述子について、保留状態にある入出力要求は取り消されません。