У меня есть асинхронный код в OSX, который в основном делает следующее:
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 документация не упоминает никаких требований для выравнивания, просто желание не иметь буфер в стеке, так как он асинхронный (который не применяется, если мы блокируем, пока чтение не закончено). Но я нашел некоторые документация на aio_read
это говорит о том, что буфер и размер должны быть выровнены на 512 байт. Кто-нибудь знает, применяется ли это ограничение (или любые другие ограничения выравнивания) к OSX? aio_read
?
Любые другие идеи о том, что может происходить здесь?
Задача ещё не решена.