假设kqueue
侦听文件修改:
(注意:为了方便起见,在示例中删除了错误管理)
#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
中的新条目执行新调用之前,添加文件才能生效。
如何避免这种情况?
kevent
,但是怎么做?可以创建一个“侦听”文件,并对其进行修改以解除kevent()
函数的阻塞,但我希望存在一个更简单的解决方案,不幸的是,我没有找到有关这方面的信息。
如何解除阻塞kevent()
,以便将新文件添加到要监视的列表中?或者是否有其他解决方案可以有效地添加新的文件来监视?
理想的解决办法是:
ksignal(kernelQueue); //ksignal does not exists
发布于 2021-01-30 04:34:30
创建一个管道,并使用EV_READ在kqueue中添加读取fd。写入另一个线程中的管道将导致kevent()返回。
https://stackoverflow.com/questions/64245246
复制相似问题