POSIX AIO: Есть ли (хороший) способ соотнести уведомления о завершении с исходным запросом? - PullRequest
2 голосов
/ 10 декабря 2011

Прав ли я, полагая, что уведомления о завершении AIO (через потоки или сигналы) не дают вам никакой информации относительно того, какой запрос был выполнен? Есть ли способ достичь этой корреляции, кроме как вызывать отдельные функции обратного вызова для каждого запроса? Якобы вы можете использовать структуру aiocb исходного запроса для выполнения вызовов aio_error и aio_return, но вы не получите указатель на структуру aiocb как часть обратного вызова уведомления. Почему, кажется, нет механизма для этого?

1 Ответ

2 голосов
/ 10 декабря 2011

Когда вы отправляете struct aiocb для запуска асинхронного ввода-вывода, вы можете заполнить его aio_sigevent член структурой struct sigevent:

   struct sigevent {
       int          sigev_notify; /* Notification method */
       int          sigev_signo;  /* Notification signal */
       union sigval sigev_value;  /* Data passed with
                                     notification */
       /* ... */
   }

   union sigval {          /* Data passed with notification */
       int     sival_int;         /* Integer value */
       void   *sival_ptr;         /* Pointer value */
   };

Используя aio_sigevent.sigev_value.sival_ptr, вы можете сохранить указатель на ваш struct aiocb (или другую структуру, в которой ваш struct aiocb является членом), который вы затем сможете найти при вызове вашего обработчика сигнала:

si->si_value.sival_ptr;

Справочная страница aio(7) была чрезвычайно полезна при исследовании этого, а на справочной странице sigevent(7) есть подробности о структуре struct sigevent.

...