我正在使用 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 中传递的所有参数:处理程序没问题,来自 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;
}
}