Pergunta

Após a discussão em Como você usa o AIO e o Epoll juntos em um único ciclo de evento?.

De fato, existem 2 APIs "AIO" no Linux. Há Posix AIO (a família de funções AIO_*), incluída em Glibc e Libaio, que eu acredito por Redhat (?), A família io_*.

O primeiro permite o registro de solicitações de notificação via membro AIOCB AIO_SIGEVENT. Isso pode ser facilmente integrado aos loops de eventos ppoll ()/pSelect (). Se você deseja integrar o Posix aio com o epoll (), é necessário traduzir o sinal em um evento em um FD dummy (talvez um cano) e ouvir -o com o Epoll, enquanto pega o sinal de maneira clássica ou com ppoll/ Selecione. Quão seguro é a primeira opção (Sighandlers normais), depende da aplicação. E talvez no Epoll, mas não estou plenamente ciente de seus internos. Posso assumir com segurança que, se eu tiver um aplicativo baseado em Epoll e quero adicionar suporte a Posix aio, então estou ferrado? Esta foi a minha pergunta.

A segunda implementação da AIO, Libaio - pode ser usada de fato com eventfd () (Struct IOCB com um membro AIO_RESFD que deve ser zero ou um evento para entregar resultados da AIO). Mas não é pelo livro. POSIX especificado, isto é.

Eu sonho em ser um usuário *BSD, onde tudo está claro. Você tem o suporte POSIX AIO e Kqueue () para eventos da AIO. Claro como cristal. Como muitas outras coisas.

Foi útil?

Solução

Observe que você pode usar Posix Aio com Epoll, há signalfd(2) Ele cria um descritor de arquivo que você pode usar para ser notificado de sinais em um loop baseado em epoll.

Além disso, a segunda API da AIO deve eventualmente ser o que o Glibc baseia na implementação do Posix Aio, mas ainda não está lá ... (eu também não sei se alguém está trabalhando nisso)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top