首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在“`kevent()”被锁定时,将“locked”添加到“locked”中?

如何在“`kevent()”被锁定时,将“locked”添加到“locked”中?
EN

Stack Overflow用户
提问于 2020-10-07 13:38:29
回答 1查看 399关注 0票数 0

假设kqueue侦听文件修改:

(注意:为了方便起见,在示例中删除了错误管理)

代码语言:javascript
运行
复制
#include <sys/types.h>
#include <sys/event.h>
#include <signal.h>
#include <cstdlib>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <vector>
#include <array>
#include <fstream>

using namespace std;

auto main() ->int
{
    constexpr static int keventsMode = NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE;

    // Create the queue
    auto kernelQueue = kqueue();

    // Open the file descriptor to be monitored
    auto file = open("./test.txt", O_EVTONLY);

    // Create the structures of kevents to monitor
    std::vector<struct kevent> keventsToMonitor;
    keventsToMonitor.emplace_back();
    EV_SET( &(*keventsToMonitor.rbegin()), file, EVFILT_VNODE, EV_ADD | EV_CLEAR, keventsMode, 0, nullptr);

    // Create a structure to get events
    std::array<struct kevent, 10> keventsData;

    // Event loop
    while( true )
    {
        // Blocking function!!! HOW TO UNBLOCK? 
        auto eventCount = kevent(kernelQueue, keventsToMonitor.data(), 
            keventsToMonitor.size(), keventsData.data(), keventsData.size(), nullptr/*&timeout*/);
        // .. manage events here
        if (eventCount) cout << "Some events" << endl;
        else cout << "timeout" << endl;
    }
}

假设我们在线程中移动while循环,并且希望向kqueue添加一个附加文件。

问题是kevent()函数将阻塞直到一个新事件到达,因此在kevent()取消阻塞和在keventsToMonitor中的新条目执行新调用之前,添加文件才能生效。

如何避免这种情况?

  1. 使用超时:如果使用长超时(例如10),添加文件将花费太长时间进行;如果使用短超时(例如50 10s),则CPU使用效率低下。

  1. Signal kevent,但是怎么做?

可以创建一个“侦听”文件,并对其进行修改以解除kevent()函数的阻塞,但我希望存在一个更简单的解决方案,不幸的是,我没有找到有关这方面的信息。

如何解除阻塞kevent() ,以便将新文件添加到要监视的列表中?或者是否有其他解决方案可以有效地添加新的文件来监视?

理想的解决办法是:

代码语言:javascript
运行
复制
ksignal(kernelQueue); //ksignal does not exists
EN

回答 1

Stack Overflow用户

发布于 2021-01-30 04:34:30

创建一个管道,并使用EV_READ在kqueue中添加读取fd。写入另一个线程中的管道将导致kevent()返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64245246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档