C 使用kqueue()查看文件只会引发一个事件
我正在发现kevent()和kqueue(),并尝试按照命令查看文件 然而,我只参加了一个活动,仅此而已。 当我试图通过添加或删除内容在第一次之后的下一次编辑我的文件时,什么都没有发生C 使用kqueue()查看文件只会引发一个事件,c,macos,file,freebsd,C,Macos,File,Freebsd,我正在发现kevent()和kqueue(),并尝试按照命令查看文件 然而,我只参加了一个活动,仅此而已。 当我试图通过添加或删除内容在第一次之后的下一次编辑我的文件时,什么都没有发生 struct kevent events_to_monitor; struct kevent event_data; struct timespec timeout; unsigned int vnode_events; int kq; int event_fd; eve
struct kevent events_to_monitor;
struct kevent event_data;
struct timespec timeout;
unsigned int vnode_events;
int kq;
int event_fd;
event_fd = open(_filename.c_str(), O_EVTONLY);
if (event_fd <=0) {
fprintf(stderr, "The file %s could not be opened for monitoring. Error was %s.\n", _filename.c_str(), strerror(errno));
exit(-1);
}
/* Open a kernel queue. */
if ((kq = kqueue()) < 0) {
fprintf(stderr, "Could not open kernel queue. Error was %s.\n", strerror(errno));
}
timeout.tv_sec = 0; // 0 seconds
timeout.tv_nsec = 500000000; // 500 milliseconds
vnode_events = NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB;
EV_SET( &events_to_monitor, event_fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, vnode_events, 0, NULL);
while (1) {
int event_count = kevent(kq, &events_to_monitor, NUM_EVENT_SLOTS, &event_data, 1, &timeout);
if ((event_count < 0) || (event_data.flags == EV_ERROR)) {
/* An error occurred. */
fprintf(stderr, "An error occurred (event count %d). The error was %s.\n", event_count, strerror(errno));
break;
}
if (event_count) {
printf("Event %" PRIdPTR " occurred. Filter %d, flags %d, filter data %" PRIdPTR ", path %s\n",
event_data.ident,
event_data.filter,
event_data.flags,
event_data.data,
(char *) event_data.udata);
} else {
printf("No event.\n");
}
/* Reset the timeout. In case of a signal interrruption, the
values may change. */
timeout.tv_sec = 0; // 0 seconds
timeout.tv_nsec = 500000000; // 500 milliseconds
}
struct kevent事件到监视器;
结构kevent事件_数据;
结构timespec超时;
无符号int-vnode_事件;
int-kq;
国际事件(fd);
event_fd=open(_filename.c_str(),O_EVTONLY);
如果(event\u fd您实际得到的是什么事件?我猜NOTE\u DELETE
。大多数编辑器都会写入新文件,以原子方式将新文件与旧文件交换,然后删除旧文件。因此,从技术上讲,编辑不会继续发生在您监视的文件上。您实际得到的是什么事件?我猜NOTE\u DELETE
。大多数编辑器会写入新文件,以原子方式将新文件与旧文件交换,然后删除旧文件。因此,从技术上讲,编辑不会继续发生在您监视的文件上。