Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用kqueue()查看文件只会引发一个事件_C_Macos_File_Freebsd - Fatal编程技术网

C 使用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

我正在发现kevent()和kqueue(),并尝试按照命令查看文件

然而,我只参加了一个活动,仅此而已。 当我试图通过添加或删除内容在第一次之后的下一次编辑我的文件时,什么都没有发生

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
。大多数编辑器会写入新文件,以原子方式将新文件与旧文件交换,然后删除旧文件。因此,从技术上讲,编辑不会继续发生在您监视的文件上。