インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

非同期 I/O 関数が原因で発生したエラーの処理

このトピックは、Windows* にのみ適用されます。

errno マクロを使用して、aio_read()aio_write()aio_fsync()lio_listio() などの非同期要求関数や aio_cancel()aio_error()aio_return()aio_suspend() などの非同期制御関数を実行中に発生したエラーを取得できます。

次に、errno の使用例を示します。

#include <stdio.h>
#include <stdlib.h>
#include <aio.h>
 
struct aiocb    my_aio;
struct aiocb   *my_aio_list[1] = {&my_aio};
 
int main()
{
  int   res;
  double  arr[123456];
 timespec_t   my_t = {1, 0};
     
/* データの初期化 */
 my_aio.aio_fildes = CreateFile("dat",
   GENERIC_READ | GENERIC_WRITE,
   FILE_SHARE_READ,
   NULL,
   OPEN_ALWAYS,
   FILE_ATTRIBUTE_NORMAL,
   NULL);
 my_aio.aio_buf    = (volatile char *)arr;
 my_aio.aio_nbytes = sizeof(arr);
 
/* 非同期の書き込みと計算を同時に行う */
 aio_write(&my_aio);
 do_compute(arr, 123456);
 
/* 非同期の書き込みを 1 秒間停止 */
 res = aio_suspend(my_aio_list, 1, &my_t);
 if ( res ) {
 
/* 操作が完了する前にタイムアウトにより呼び出しが終了*/
  if ( errno == EAGAIN ) {
  res = aio_suspend(my_aio_list, 1, 0);
  if ( res ) {
  printf("aio_suspend returned non-0\n"); return errno;}
  }
  else
  if ( res ) {
  printf("aio_suspend returned neither 0 nor EAGAIN\n");
  return errno;
  }
 }
 
 CloseHandle(my_aio.aio_fildes);
 printf("\nPass\n");
 
 return 0;
}

この例では、aio_write() を使用して非同期の書き込み操作を実行し、同時に do_compute() 関数でいくつかの計算を行っています。保留状態の書き込み操作は、aio_suspend() を使用して 1 秒間停止されています。

非同期の書き込み操作の実行に成功すると、0 が返されます。操作が完了する前に呼び出しがタイムアウトすると、EAGAIN やほかのエラー値が返されます。

errno マクロを使用して、EAGAIN を確認できます。