我在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);
偏移是未对齐的,缓冲区没有对齐限制。 (我知道这是一种使用async io进行同步读取的无意义的方法,但这与我的问题无关。)
在运行此代码的某些条件下,我收到错误代码14(错误地址)。我认为问题在于,可能读取的内容不在缓冲区的末尾,而是在filedes
上写入。
有没有人经历过类似的事情?
OSX documentation提到没有对齐的要求,只是希望不在堆栈上有缓冲区,因为它是异步的(如果我们阻塞直到读完成,它就不适用)。但我确实在aio_read
上发现了一些documentation,表示缓冲区和大小需要512字节对齐。有谁知道这个限制(或任何其他对齐限制)是否适用于OSX aio_read
?
关于可能会发生什么的任何其他想法?