im Anschluss an die Diskussion bei How do you use AIO and epoll together in a single event loop?.revisiting "wie verwenden Sie aio und epoll zusammen"
Es gibt tatsächlich 2 "aio" APIs in Linux. Es gibt POSIX aio (die aio_ * Familie von Funktionen), in glibc enthalten und libaio entwickelt, glaube ich von RedHat (?), Der io_ * Familie.
Der erste ermöglicht die Registrierung von Benachrichtigungsanforderungen über aio_sigevent aiocb-Mitglied. Dies kann leicht mit ppoll()/pselect() Event Loops integriert werden. Wenn Sie POSIX aio mit epoll() integrieren wollen, müssen Sie das Signal in ein Event auf einem Dummy fd (eine Pipe vielleicht) übersetzen und mit epoll abhören, während Sie das Signal entweder klassisch oder mit ppoll/wählen. Wie sicher die erste Wahl ist (normale Sighandler), hängt von der Anwendung ab. Und vielleicht auf epoll, aber ich bin mir seiner Interna nicht ganz bewusst. Darf ich mit Sicherheit davon ausgehen, dass ich, wenn ich eine epollbasierte App habe und POSIX aio-Unterstützung hinzufügen möchte, mich schäme? Das war meine Frage.
Die zweite AIO-Implementierung, libaio - kann in der Tat mit eventfd() verwendet werden (struct iocb mit einem aio_resfd-Member, von dem erwartet wird, dass er null ist oder ein eventfd, um AIO-Ergebnisse zu liefern). Aber es ist nicht nach dem Buch. POSIX-spezifiziert, das heißt.
Ich träume davon, ein * BSD Benutzer zu sein, wo alles klar ist. Sie haben die POSIX AIO- und kqueue() - Unterstützung für AIO-Ereignisse. Kristallklar. Wie viele andere Dinge.
können Sie ein Beispiel geben, um '' signalfd (2) 'kombinieren mit POSIX aio und' epoll' ('select',' poll') zu verwenden, da die Struktur 'siginfo_t' das Member' si_value' während die Struktur 'signalfd_siginfo' hat Return durch Lesen der 'signalfd' hat kein entsprechendes Member' ssi_value', wie kann ich den 'si_value' zurückbekommen, der zurückgegeben wird, wenn ein posix aio vollständig ist, indem man' signalfd' liest? – toolchainX
@toolchainX nein, sorry, ich habe es nie selbst gemacht – Spudd86