gpt4 book ai didi

异步读取 inotify 描述符失败

转载 作者:行者123 更新时间:2023-12-04 02:57:08 25 4
gpt4 key购买 nike

我正在编写一个基于源代码的监控文件程序:https://github.com/kvikas/file-monitor-service/blob/master/

我的程序使用 boost::asio::stream_descriptor::async_read_some() 从 inotify 描述符中异步读取 http://linux.die.net/man/7/inotify

我的代码如下:

构造函数:

void init(){
int fd = inotify_init1(IN_NONBLOCK);
int wd = inotify_add_watch(fd_, "./test.txt", IN_ALL_EVENTS);
stream_.reset(new boost::asio::posix::stream_descriptor(io_service_, fd_)));
}

异步读取:

template<typename Monitor_Handler>
void async_monitor(Monitor_Handler handler) {
stream_->async_read_some(boost::asio::buffer(buffer_),
boost::bind(&monitor::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) {
//process buffer
async_monitor(handler);

}

错误在于,首先 handle_monitor 被调用多次(多个事件,例如 MODIFY、ACCESS、OPEN...),用于监视文件中的第一个更改。再次调用 async_read_some 方法后,我再也没有信号(不再调用 handle_monitor)

但是,当我尝试重置 inotify 描述并再次读取监控文件时 ==> 它起作用了,handle_monitor 被调用以获取此类监控文件中的新更改。

修改后的代码:

template<typename Monitor_Handler>
void handle_monitor(const boost::system::error_code &ec,
std::size_t bytes_transferred, Monitor_Handler handler) {
//process buffer
async_monitor(handler);
init();//for resetting the inotify desciptor

}

你们能帮我解释一下吗????我很想知道你的答案......

最佳答案

我觉得这很可疑

void init(){
int fd = inotify_init1(IN_NONBLOCK);
int wd = inotify_add_watch(fd_, "./test.txt", IN_ALL_EVENTS);
stream_.reset(new boost::asio::posix::stream_descriptor(io_service_, fd_)));
}

您应该使用从 notify_init1() 返回的值创建 stream_descriptor,这将是 fd 而不是 fd_。我假设 fd_ 是一个类成员,并且可能未初始化或初始化为 0

关于异步读取 inotify 描述符失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com