2010-01-31 10 views
9

siguiendo la discusión en How do you use AIO and epoll together in a single event loop?.revisitando "cómo se usa aio y epoll juntos"

De hecho, hay 2 API "aio" en Linux. Hay POSIX aio (la familia de funciones aio_ *), incluida en glibc y libaio desarrollada Creo que por RedHat (?), La familia io_ *.

El primero permite el registro de solicitudes de notificación a través del miembro aio_sigevent aiocb. Eso se puede integrar fácilmente con los bucles de eventos ppoll()/pselect(). Si quieres integrar POSIX aio con epoll(), entonces necesitas traducir la señal a un evento en fd ficticio (quizás una pipa) y escucharla con epoll, mientras captas la señal de forma clásica o con ppoll/seleccionar. Qué tan segura es la primera opción (signatarios normales), depende de la aplicación. Y tal vez en epoll pero no estoy completamente enterado de sus aspectos internos. ¿Puedo suponer sin temor a equivocarme que si tengo una aplicación basada en epoll y quiero agregar soporte POSIO aio, entonces estoy jodido? Esta fue mi pregunta.

La segunda implementación de AIO, libaio - se puede usar de hecho con eventfd() (struct iocb teniendo un miembro aio_resfd que se espera sea cero o un eventfd para entregar resultados AIO). Pero no es por el libro. POSIX-especificado, eso es.

Sueño con ser un * usuario de BSD donde todo está claro. Tiene el soporte POSIX AIO y kqueue() para eventos AIO. Claro como el cristal. Como muchas otras cosas.

Respuesta

6

tenga en cuenta que PUEDE utilizar POSIX aio con epoll, hay signalfd(2) que crea un descriptor de archivo que luego puede utilizar para recibir notificaciones de señales en un bucle basado en epoll.

También la segunda API AIO se supone que es lo que finalmente bases glibc es la implementación de POSIX AIO en, simplemente no ha llegado todavía ... (No sé si alguien está trabajando en ello tampoco)

+0

puede dar un ejemplo para usar la combinación 'signalfd (2)' con POSIX aio y 'epoll' (' select', 'poll'), ya que la estructura' siginfo_t' tiene el miembro 'si_value' mientras que la estructura' signalfd_siginfo' regresa leyendo el 'signalfd' dosen't tiene un miembro correspondiente' ssi_value', ¿cómo puedo obtener el 'si_value' devuelto cuando una posix aio completa al leer el' signalfd'? – toolchainX

+0

@toolchainX no, lo siento, en realidad nunca lo he hecho yo mismo – Spudd86