GNU libcのAIO
SVR4 *1 以降のシステムは、大抵非同期IO(AIO *2 )を持っています。本来ブロックするread/writeなどのIOをブロックせずに行ない、後で結果を受け取ることが出来る、使い方によっては便利なものです。
ところが、多分ユーザがあまりいないからなのか *3 、GNU libc2.3.2/2.3.3に含まれているAIOライブラリは、微妙に動作が仕様と異なっていて困ります。
具体的には、aio_error()/aio_return()が期待通りに振舞ってくれないのです。manpageを見ると、aio_errorは、
ERRORSとか、書いてあるし、実際にSolarisでは、aio_return()の後でaio_error()を呼び出すと、正しくEINVALが返ります。ところが、Linux上でこれをやると、いつも、何度でも、正常終了の'0'が返るのです。♪(死んでるはずのAIOが)生きている〜不思議……ぁぅぅ oTL
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.
あかん、これでは、処理済のIOなのかそうでないのかがaiocbを見ても判らないっ……。別に、処理済かどうかのフラグを持たないといけない…… oTL
*1
: SVR4.2MPだったかもしれない
*2 : Asynchronous IO...AssistantIOではない。
*3 : 多分、マルチスレッドでIO専用スレッドを設けるなどする方が今では多いのではなかろうか。
*2 : Asynchronous IO...AssistantIOではない。
*3 : 多分、マルチスレッドでIO専用スレッドを設けるなどする方が今では多いのではなかろうか。
コメントする