Требуется объяснение формулировки фильтра kevent.

У меня есть следующие строки для keventв man:

        EVFILT_TIMER        Establishes an arbitrary timer identified by ident.
                     When adding a timer, data specifies the moment to
                     fire the timer (for NOTE_ABSTIME) or the timeout
                     period.  The timer will be periodic unless EV_ONESHOT
                     or NOTE_ABSTIME is specified.  On return, data
                     contains the number of times the timeout has expired
                     since the last call to kevent().  For non-monotonic
                     timers, this filter automatically sets the EV_CLEAR
                     flag internally.

                     The filter accepts the following flags in the fflags
                     argument:

                     NOTE_SECONDS      data is in seconds.

                     NOTE_MSECONDS     data is in milliseconds.

                     NOTE_USECONDS     data is in microseconds.

                     NOTE_NSECONDS     data is in nanoseconds.

                     NOTE_ABSTIME      The specified expiration time is
                                       absolute.

                     If fflags is not set, the default is milliseconds.
                     On return, fflags contains the events which triggered
                     the filter.

Теперь я не понимаю последнюю строку:

По возвращении fflags содержит события, вызвавшие срабатывание фильтра.

Я имею в виду буквально, я не понимаю предложение. Событие по определению является структурой. Как может содержать "события"?

Обновлять

Возвращаемое значение fflagsиз EVFILT_TIMERэто то же самое, что было передано. Благодаря ОП принятого ответа.

1 ответ

Согласно FreeBSD-13.0-RELEASE-p11источники:

Из того, что мы видим в /usr/src/sys/kern/kern_event.c(как пример использования):

      static int
filt_proc(struct knote *kn, long hint)
{
    struct proc *p;
    u_int event;

    p = kn->kn_ptr.p_proc;
    if (p == NULL) /* already activated, from attach filter */
        return (0);

    /* Mask off extra data. */
    event = (u_int)hint & NOTE_PCTRLMASK;

    /* If the user is interested in this event, record it. */
    if (kn->kn_sfflags & event)
        kn->kn_fflags |= event;

    /* Process is gone, so flag the event as finished. */
    if (event == NOTE_EXIT) {
        kn->kn_flags |= EV_EOF | EV_ONESHOT;
        kn->kn_ptr.p_proc = NULL;
        if (kn->kn_fflags & NOTE_EXIT)
            kn->kn_data = KW_EXITCODE(p->p_xexit, p->p_xsig);
        if (kn->kn_fflags == 0)
            kn->kn_flags |= EV_DROP;
        return (1);
    }

    return (kn->kn_fflags != 0);
}

Значение u_int eventвыше в одном из некоторых определенных, в которых находятся u_intслишком.

Таким образом, используется как ввод и вывод , а также определено на странице руководства:

Предустановленные системные фильтры перечислены ниже. Аргументы могут передаваться в фильтр и из него через флаги и поля данных в структуре kevent.

Вы найдете eventнаправленный fflagsв /usr/include/sys/event.h

Другие вопросы по тегам