基本的に次のことを行う OSX の async io コードがあります。
aiocb request;
memset(&request, 0 sizeof(request));
char buffer[64 * 1024];
int filedes = open(path, O_RDONLY);
request->aio_offset = offset;
request->aio_fildes = filedes;
request->aio_buf = buffer;
request->aio_nbytes = 64 * 1024;
request->aio_lio_opcode = LIO_READ;
int result = aio_read(&request);
result = aio_suspend(&request, 1, Riot::INFINITE_WAIT);
int error = aio_error(&request);
オフセットはアラインされておらず、バッファにはアラインメントの制限がありません。(これは同期読み取りに async io を使用する「無意味な」方法であることはわかっていますが、それは私の質問には関係ありません)。
特定の条件下でこのコードを実行すると、エラー コード 14 (Bad Address) が表示されます。問題は、おそらく読み取りがバッファの最後から外れて、filedes
.
誰かが似たようなことを経験しましたか?
OSXのドキュメントでは、非同期であるため、スタックにバッファを持たないという要望だけで、アライメントの要件は言及されていません(読み取りが完了するまでブロックすると適用されません)。しかし、バッファとサイズを 512 バイトに揃える必要があるというドキュメントをいくつか見つけました。aio_read
この制限 (またはその他の配置制限) が OSX に適用されるかどうかは誰にもわかりませaio_read
んか?
ここで何が起こっているのかについて他のアイデアはありますか?