我在 OSX 中有异步 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);
偏移量是非对齐的,缓冲区没有对齐限制。(我知道这是使用异步 io 进行同步读取的“毫无意义”的方式,但这与我的问题无关)。
在某些情况下,当我运行此代码时,我会收到错误代码 14(错误地址)。我认为问题在于可能读取超出缓冲区的末尾并写入filedes
.
有没有人经历过类似的事情?
OSX 文档没有提到对齐的要求,只是希望堆栈上没有缓冲区,因为它是异步的(如果我们在读取完成之前阻塞,则不适用)。但我确实找到了一些文档说aio_read
缓冲区和大小需要 512 字节对齐。有谁知道这个限制(或任何其他对齐限制)是否适用于 OSX aio_read
?
关于这里可能发生的任何其他想法?