プロジェクトに基づいて、boost::asio を使用して非同期ファイル監視プログラムを作成しています: https://github.com/kvikas/file-monitor-service/tree/master/inotify
このプロジェクトは、inotify_init1(IN_NONBLOCK) によって返されるファイル記述子からの非同期読み取りに boost::asio::posix::stream_descriptor を使用します。
残念ながら、このプロジェクトを書き直すと、プログラム内の stream_descriptor のメソッド async_read_some は、監視対象ファイルの最初の変更に対して完了ハンドラを数回 (イベント: OPEN、ACCESS、MODIFY を含む) しか呼び出しません。
次に監視対象ファイルを変更すると、メソッド async_monitor が再度呼び出されますが、完了ハンドラーは呼び出されなくなります。
メソッド aync_read_some で渡されたすべての引数を確認しました: ハンドラーは問題ありません。initify_init() からの記述はまだ開いています。
完了ハンドラが呼び出されなくなった理由を説明していただけませんか??? または、メソッド async_read_some が成功しない理由をいくつか教えてください!
私のコードは次のとおりです。
template<typename Monitor_Handler>
void async_monitor(Monitor_Handler handler) {
input_->async_read_some(boost::asio::buffer(buffer_),
boost::bind(&dir_monitor_impl::handle_monitor<Monitor_Handler>,
shared_from_this(), boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred, handler));
}
template<typename Monitor_Handler>
void handle_monitor(const boost::system::error_code &ec,
std::size_t bytes_transferred, Monitor_Handler handler) {
std::cout<<"Handle_monitor called"<<std::endl;
if (!ec) {
//process buffer
async_monitor(handler);//async_monitor again
}else{
std::cout<<"Error at Handle_monitor"<<std::endl;
}
}