【发布时间】:2016-11-15 19:08:27
【问题描述】:
我正在为一个 inotify 库编写测试,我目前正在捕获 IN_CREATE 事件。我正在尝试使用 boost::filesystem::ofstream,它本质上是 std::basic_ofstream,但我没有收到 IN_CREATE 事件。
有两个线程正在执行,主线程和我创建的一个处理事件的线程,如下所示:
std::thread thread([&]()
{
boost::asio::io_service::work(g_io_service);
g_io_service.run();
}
每当收到事件时,库都会在上述线程的上下文中调用此函数:
[&](event_type event, std::string const & path)
{
std::lock_guard<std::mutex> lock(ready_mtx);
events.push_back(event);
condition.notify_all();
ready = true;
}
测试的样子(主线程):
{
boost::filesystem::ofstream file(path);
file << "test";
}
{
std::lock_guard<std::mutex> lock(ready_mtx);
while (!ready)
condition.wait(lock);
REQUIRE(events[0] == event_type::FILE_CREATE);
}
我期待创建和修改文件的事件,当我在终端中查找文件时,实际上正在创建文件,但我没有收到任何事件。
但是,当我使用 echo "test" > test.file 手动创建文件时,我确实收到了创建和修改事件。
这种行为有原因吗?我是不是走错了路?
【问题讨论】:
-
关闭流时是否收到事件?
-
不,ofstream的析构函数调用close。
-
我想不出任何适用于这种情况的方法,但请查看
inotify文档的警告部分:man7.org/linux/man-pages/man7/inotify.7.html -
发布一个最小的完整示例,读者可以尝试。
-
你能否创建一个简单的 MCVE,使用普通的
ofstream和inotifywait,而无需经历所有的提升?
标签: c++ fstream inotify boost-filesystem