GNU libcのAIO

  • 投稿日:
  • by
  • カテゴリ:

SVR4(SVR4.2MPだったかもしれない)以降のシステムは、大抵非同期IO(AIO(Asynchronous IO...AssistantIOではない。))を持っています。本来ブロックするread/writeなどのIOをブロックせずに行ない、後で結果を受け取ることが出来る、使い方によっては便利なものです。

ところが、多分ユーザがあまりいないからなのか(多分、マルチスレッドでIO専用スレッドを設けるなどする方が今では多いのではなかろうか。)GNU libc2.3.2/2.3.3に含まれているAIOライブラリは、微妙に動作が仕様と異なっていて困ります

具体的には、aio_error()/aio_return()が期待通りに振舞ってくれないのです。manpageを見ると、aio_errorは、

ERRORS

EINVAL aiocbp does not point at a control block for an asynchronous I/O request of which the return status (see aio_return(3)) has not been retrieved yet.
とか、書いてあるし、実際にSolarisでは、aio_return()の後でaio_error()を呼び出すと、正しくEINVALが返ります。ところが、Linux上でこれをやると、いつも、何度でも正常終了の'0'が返るのです。♪(死んでるはずのAIOが)生きている〜不思議……ぁぅぅ oTL

あかん、これでは、処理済のIOなのかそうでないのかがaiocbを見ても判らないっ……。別に、処理済かどうかのフラグを持たないといけない…… oTL