I have following lines for kevent
in the 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.
Now, I do not understand the last line:
On return, fflags contains the events which triggered the filter.
I mean literally, I do not understand the sentence. The event by the definition is a struct. How can fflags
contain "events"?
Update
The return value of fflags
of EVFILT_TIMER
is the same as that was passed in. Thanks to OP of accepted answer.
CodePudding user response:
According to the FreeBSD-13.0-RELEASE-p11
sources:
From what we see in /usr/src/sys/kern/kern_event.c
(as an example of use):
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);
}
The value of the u_int event
above in one from some defined in /usr/include/sys/event.h
which are u_int
too.
So, the fflags
is used as input and output as well as defined in the man page:
The predefined system filters are listed below. Arguments may be passed to and from the filter via the fflags and data fields in the kevent structure.
You will find the event
referred by fflags
in /usr/include/sys/event.h