Asioでepollを使うのをやめる

Linux環境下でのBoost.Asioは、標準でepoll_reactorを使用します(AsioではIO多重化を行うクラスをreactorと呼んでいます)。しかしながら、epollは登録できるfile descriptorの種類がselectよりも狭いという仕様上の問題があります。例えばファイル(regular file)を指すfile descriptorは登録できません。たぶん、ファイルに対してごにょごにょしたい場合は、カーネルが提供しているaioシステムコールを使えってことなんでしょう。

さて、epollがregular fileを指すfile descriptorを扱えないため、asio::posix::stream_descriptorがregular fileを扱えないという問題が発生します。この問題を簡単に解決する方法は、性能を犠牲にして、epollではなくselectを使うようにすることです。BOOST_ASIO_DISABLE_EPOLL をdefineするとepollの使用を拒否できます。詳しくは boost/asio/detail/config.hpp を読んでください。

windows向けだと、id:faith_and_brave:20110322 にあるようにwindows::stream_handleを使わないといけなかったり、非常にめんどくさいので、asio::file_streamみたいな抽象的な型が欲しいところではあります。