Hatena::ブログ(Diary)

fjnlの生存記録のような何か このページをアンテナに追加 RSSフィード Twitter

2011-10-05

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みたいな抽象的な型が欲しいところではあります。

faith_and_bravefaith_and_brave 2011/10/05 17:28 Linuxでのファイルの扱いに関しては今ちょうど議論されてるようです。
(ぼくはLinuxに明るくないので問題がよくわかってません。)
http://thread.gmane.org/gmane.comp.lib.boost.asio.user/4926

トラックバック - http://d.hatena.ne.jp/fjnl/20111005/1317802868