Почему асинхронное чтение завершается раньше чем надо?

Здравствуйте. Вызываю aio_read, и сразу срабатывает обработчик сигнала. aio_error говорит, что чтение завершено, aio_return возвращает 0
То есть, данных нет, а чтение уже закончилось

//установка обработчика сигнала
struct sigaction settings;
memset(&settings, 0, sizeof(settings));
settings.sa_flags = SA_SIGINFO;
settings.sa_sigaction = SigHandler;
sigaction(SIGUSR1, &settings, NULL);

//Чтение
memset(&readAio, 0, sizeof(readAio));
readAio.aio_fildes = socket;
readAio.aio_buf = buffer;
readAio.aio_nbytes = BUFFER_SIZE;

sigevent event;
memset(&event, 0, sizeof(event));
event.sigev_notify = SIGEV_SIGNAL;
event.sigev_signo = SIGUSR1;
event.sigev_value.sival_int = socket;
readAio.aio_sigevent = event;

aio_read(&readAio);


С чем связано такое поведение? Как прочитать данные из сокета?
  • Вопрос задан
  • 299 просмотров
Пригласить эксперта
Ответы на вопрос 1
IlyaEvseev
@IlyaEvseev
Opensource geek
1) Покажите код функции SigHandler

2) aio_read не производит фактическое чтение, а сообщает системе, что делать, когда данные для чтения появятся.
После её вызова программа может либо заниматься другими задачами, либо ждать, пока чтение завершится.
Для проверки и ожидания используйте aio_return, aio_error и aio_suspend.

Примеры:
- https://software.intel.com/en-us/node/524452 (для венды, но лучше, чем ничего)
- https://gist.github.com/rsms/771059 (EINPROGRESS проверяется некрасиво, лучше использовать aio_suspend)

Учебники:
- books.google.com => Embedded Linux System Design and Development => глава 7.3.8
- https://www3.physnet.uni-hamburg.de/physnet/Tru64-... (для Юникса, поэтому в Линуксе могут быть мелкие отличия)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы