我正在使用boost :: asio编写一个异步文件监控程序,基于项目:https://github.com/kvikas/file-monitor-service/tree/master/inotify
此项目使用boost :: asio :: posix :: stream_descriptor从inotify_init1(IN_NONBLOCK)返回的文件描述符中异步读取
不幸的是,当我重写这个项目时,我的程序中stream_descriptor的方法async_read_some只调用我的完成处理程序几次(包括事件:OPEN,ACCESS,MODIFY),以便监视文件中的第一次更改。
下次更改受监视文件时,会再次调用async_monitor方法,但不再调用完成处理程序。
我检查了方法aync_read_some中传递的所有参数:handler是正确的,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;
}
}