aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/sys/kqueue.2
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/sys/kqueue.2')
-rw-r--r--lib/libc/sys/kqueue.2887
1 files changed, 0 insertions, 887 deletions
diff --git a/lib/libc/sys/kqueue.2 b/lib/libc/sys/kqueue.2
deleted file mode 100644
index 066ad717111a..000000000000
--- a/lib/libc/sys/kqueue.2
+++ /dev/null
@@ -1,887 +0,0 @@
-.\" Copyright (c) 2000 Jonathan Lemon
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd March 26, 2023
-.Dt KQUEUE 2
-.Os
-.Sh NAME
-.Nm kqueue ,
-.Nm kevent
-.Nd kernel event notification mechanism
-.Sh LIBRARY
-.Lb libc
-.Sh SYNOPSIS
-.In sys/event.h
-.Ft int
-.Fn kqueue "void"
-.Ft int
-.Fn kqueuex "u_int flags"
-.Ft int
-.Fo kevent
-.Fa "int kq"
-.Fa "const struct kevent *changelist"
-.Fa "int nchanges"
-.Fa "struct kevent *eventlist"
-.Fa "int nevents"
-.Fa "const struct timespec *timeout"
-.Fc
-.Fn EV_SET "kev" ident filter flags fflags data udata
-.Sh DESCRIPTION
-The
-.Fn kqueue
-system call
-provides a generic method of notifying the user when an event
-happens or a condition holds, based on the results of small
-pieces of kernel code termed filters.
-A kevent is identified by the (ident, filter) pair; there may only
-be one unique kevent per kqueue.
-.Pp
-The filter is executed upon the initial registration of a kevent
-in order to detect whether a preexisting condition is present, and is also
-executed whenever an event is passed to the filter for evaluation.
-If the filter determines that the condition should be reported,
-then the kevent is placed on the kqueue for the user to retrieve.
-.Pp
-The filter is also run when the user attempts to retrieve the kevent
-from the kqueue.
-If the filter indicates that the condition that triggered
-the event no longer holds, the kevent is removed from the kqueue and
-is not returned.
-.Pp
-Multiple events which trigger the filter do not result in multiple
-kevents being placed on the kqueue; instead, the filter will aggregate
-the events into a single struct kevent.
-Calling
-.Fn close
-on a file descriptor will remove any kevents that reference the descriptor.
-.Pp
-The
-.Fn kqueue
-system call
-creates a new kernel event queue and returns a descriptor.
-The queue is not inherited by a child created with
-.Xr fork 2 .
-However, if
-.Xr rfork 2
-is called without the
-.Dv RFFDG
-flag, then the descriptor table is shared,
-which will allow sharing of the kqueue between two processes.
-.Pp
-The
-.Fn kqueuex
-system call also creates a new kernel event queue, and additionally takes
-the
-.Fa flags
-argument, which is a bitwise-inclusive OR of the following flags:
-.Bl -tag -width "KQUEUE_CLOEXEC"
-.It Fa KQUEUE_CLOEXEC
-The returned file descriptor is automatically closed on
-.Xr execve 2
-.El
-The
-.Ql fd = kqueue()
-call is equivalent to
-.Ql fd = kqueuex(0) .
-.Pp
-For compatibility with
-.Nx ,
-the
-.Fn kqueue1
-function is provided, which accepts the
-.Dv O_CLOEXEC
-flag with the expected semantic.
-.Pp
-The
-.Fn kevent
-system call
-is used to register events with the queue, and return any pending
-events to the user.
-The
-.Fa changelist
-argument
-is a pointer to an array of
-.Va kevent
-structures, as defined in
-.In sys/event.h .
-All changes contained in the
-.Fa changelist
-are applied before any pending events are read from the queue.
-The
-.Fa nchanges
-argument
-gives the size of
-.Fa changelist .
-The
-.Fa eventlist
-argument
-is a pointer to an array of kevent structures.
-The
-.Fa nevents
-argument
-determines the size of
-.Fa eventlist .
-When
-.Fa nevents
-is zero,
-.Fn kevent
-will return immediately even if there is a
-.Fa timeout
-specified unlike
-.Xr select 2 .
-If
-.Fa timeout
-is a non-NULL pointer, it specifies a maximum interval to wait
-for an event, which will be interpreted as a struct timespec.
-If
-.Fa timeout
-is a NULL pointer,
-.Fn kevent
-waits indefinitely.
-To effect a poll, the
-.Fa timeout
-argument should be non-NULL, pointing to a zero-valued
-.Va timespec
-structure.
-The same array may be used for the
-.Fa changelist
-and
-.Fa eventlist .
-.Pp
-The
-.Fn EV_SET
-macro is provided for ease of initializing a
-kevent structure.
-.Pp
-The
-.Va kevent
-structure is defined as:
-.Bd -literal
-struct kevent {
- uintptr_t ident; /* identifier for this event */
- short filter; /* filter for event */
- u_short flags; /* action flags for kqueue */
- u_int fflags; /* filter flag value */
- int64_t data; /* filter data value */
- void *udata; /* opaque user data identifier */
- uint64_t ext[4]; /* extensions */
-};
-.Ed
-.Pp
-The fields of
-.Fa struct kevent
-are:
-.Bl -tag -width "Fa filter"
-.It Fa ident
-Value used to identify this event.
-The exact interpretation is determined by the attached filter,
-but often is a file descriptor.
-.It Fa filter
-Identifies the kernel filter used to process this event.
-The pre-defined
-system filters are described below.
-.It Fa flags
-Actions to perform on the event.
-.It Fa fflags
-Filter-specific flags.
-.It Fa data
-Filter-specific data value.
-.It Fa udata
-Opaque user-defined value passed through the kernel unchanged.
-.It Fa ext
-Extended data passed to and from kernel.
-The
-.Fa ext[0]
-and
-.Fa ext[1]
-members use is defined by the filter.
-If the filter does not use them, the members are copied unchanged.
-The
-.Fa ext[2]
-and
-.Fa ext[3]
-members are always passed through the kernel as-is,
-making additional context available to application.
-.El
-.Pp
-The
-.Va flags
-field can contain the following values:
-.Bl -tag -width EV_DISPATCH
-.It Dv EV_ADD
-Adds the event to the kqueue.
-Re-adding an existing event
-will modify the parameters of the original event, and not result
-in a duplicate entry.
-Adding an event automatically enables it,
-unless overridden by the EV_DISABLE flag.
-.It Dv EV_ENABLE
-Permit
-.Fn kevent
-to return the event if it is triggered.
-.It Dv EV_DISABLE
-Disable the event so
-.Fn kevent
-will not return it.
-The filter itself is not disabled.
-.It Dv EV_DISPATCH
-Disable the event source immediately after delivery of an event.
-See
-.Dv EV_DISABLE
-above.
-.It Dv EV_DELETE
-Removes the event from the kqueue.
-Events which are attached to
-file descriptors are automatically deleted on the last close of
-the descriptor.
-.It Dv EV_RECEIPT
-This flag is useful for making bulk changes to a kqueue without draining
-any pending events.
-When passed as input, it forces
-.Dv EV_ERROR
-to always be returned.
-When a filter is successfully added the
-.Va data
-field will be zero.
-Note that if this flag is encountered and there is no remaining space in
-.Fa eventlist
-to hold the
-.Dv EV_ERROR
-event, then subsequent changes will not get processed.
-.It Dv EV_ONESHOT
-Causes the event to return only the first occurrence of the filter
-being triggered.
-After the user retrieves the event from the kqueue,
-it is deleted.
-.It Dv EV_CLEAR
-After the event is retrieved by the user, its state is reset.
-This is useful for filters which report state transitions
-instead of the current state.
-Note that some filters may automatically
-set this flag internally.
-.It Dv EV_EOF
-Filters may set this flag to indicate filter-specific EOF condition.
-.It Dv EV_ERROR
-See
-.Sx RETURN VALUES
-below.
-.It Dv EV_KEEPUDATA
-Causes
-.Fn kevent
-to leave unchanged any
-.Fa udata
-associated with an existing event.
-This allows other aspects of the event to be modified without requiring the
-caller to know the
-.Fa udata
-value presently associated.
-This is especially useful with
-.Dv NOTE_TRIGGER
-or flags like
-.Dv EV_ENABLE .
-This flag may not be used with
-.Dv EV_ADD .
-.El
-.Pp
-The predefined system filters are listed below.
-Arguments may be passed to and from the filter via the
-.Va fflags
-and
-.Va data
-fields in the kevent structure.
-.Bl -tag -width "Dv EVFILT_PROCDESC"
-.It Dv EVFILT_READ
-Takes a descriptor as the identifier, and returns whenever
-there is data available to read.
-The behavior of the filter is slightly different depending
-on the descriptor type.
-.Bl -tag -width 2n
-.It Sockets
-Sockets which have previously been passed to
-.Xr listen 2
-return when there is an incoming connection pending.
-.Va data
-contains the size of the listen backlog.
-.Pp
-Other socket descriptors return when there is data to be read,
-subject to the
-.Dv SO_RCVLOWAT
-value of the socket buffer.
-This may be overridden with a per-filter low water mark at the
-time the filter is added by setting the
-.Dv NOTE_LOWAT
-flag in
-.Va fflags ,
-and specifying the new low water mark in
-.Va data .
-On return,
-.Va data
-contains the number of bytes of protocol data available to read.
-.Pp
-If the read direction of the socket has shutdown, then the filter
-also sets
-.Dv EV_EOF
-in
-.Va flags ,
-and returns the socket error (if any) in
-.Va fflags .
-It is possible for EOF to be returned (indicating the connection is gone)
-while there is still data pending in the socket buffer.
-.It Vnodes
-Returns when the file pointer is not at the end of file.
-.Va data
-contains the offset from current position to end of file,
-and may be negative.
-.Pp
-This behavior is different from
-.Xr poll 2 ,
-where read events are triggered for regular files unconditionally.
-This event can be triggered unconditionally by setting the
-.Dv NOTE_FILE_POLL
-flag in
-.Va fflags .
-.It "Fifos, Pipes"
-Returns when the there is data to read;
-.Va data
-contains the number of bytes available.
-.Pp
-When the last writer disconnects, the filter will set
-.Dv EV_EOF
-in
-.Va flags .
-This will be cleared by the filter when a new writer connects,
-at which point the
-filter will resume waiting for data to become available before
-returning.
-.It "BPF devices"
-Returns when the BPF buffer is full, the BPF timeout has expired, or
-when the BPF has
-.Dq immediate mode
-enabled and there is any data to read;
-.Va data
-contains the number of bytes available.
-.It Eventfds
-Returns when the counter is greater than 0;
-.Va data
-contains the counter value, which must be cast to
-.Vt uint64_t .
-.It Kqueues
-Returns when pending events are present on the queue;
-.Va data
-contains the number of events available.
-.El
-.It Dv EVFILT_WRITE
-Takes a descriptor as the identifier, and returns whenever
-it is possible to write to the descriptor.
-For sockets, pipes
-and fifos,
-.Va data
-will contain the amount of space remaining in the write buffer.
-The filter will set
-.Dv EV_EOF
-when the reader disconnects, and for the fifo case, this will be cleared
-when a new reader connects.
-Note that this filter is not supported for vnodes.
-.Pp
-For sockets, the low water mark and socket error handling is
-identical to the
-.Dv EVFILT_READ
-case.
-.Pp
-For eventfds,
-.Va data
-will contain the maximum value that can be added to the counter
-without blocking.
-.Pp
-For BPF devices, when the descriptor is attached to an interface the filter
-always indicates that it is possible to write and
-.Va data
-will contain the MTU size of the underlying interface.
-.It Dv EVFILT_EMPTY
-Takes a descriptor as the identifier, and returns whenever
-there is no remaining data in the write buffer.
-.It Dv EVFILT_AIO
-Events for this filter are not registered with
-.Fn kevent
-directly but are registered via the
-.Va aio_sigevent
-member of an asynchronous I/O request when it is scheduled via an
-asynchronous I/O system call such as
-.Fn aio_read .
-The filter returns under the same conditions as
-.Fn aio_error .
-For more details on this filter see
-.Xr sigevent 3 and
-.Xr aio 4 .
-.It Dv EVFILT_VNODE
-Takes a file descriptor as the identifier and the events to watch for in
-.Va fflags ,
-and returns when one or more of the requested events occurs on the descriptor.
-The events to monitor are:
-.Bl -tag -width "Dv NOTE_CLOSE_WRITE"
-.It Dv NOTE_ATTRIB
-The file referenced by the descriptor had its attributes changed.
-.It Dv NOTE_CLOSE
-A file descriptor referencing the monitored file, was closed.
-The closed file descriptor did not have write access.
-.It Dv NOTE_CLOSE_WRITE
-A file descriptor referencing the monitored file, was closed.
-The closed file descriptor had write access.
-.Pp
-This note, as well as
-.Dv NOTE_CLOSE ,
-are not activated when files are closed forcibly by
-.Xr unmount 2 or
-.Xr revoke 2 .
-Instead,
-.Dv NOTE_REVOKE
-is sent for such events.
-.It Dv NOTE_DELETE
-The
-.Fn unlink
-system call was called on the file referenced by the descriptor.
-.It Dv NOTE_EXTEND
-For regular file, the file referenced by the descriptor was extended.
-.Pp
-For directory, reports that a directory entry was added or removed,
-as the result of rename operation.
-The
-.Dv NOTE_EXTEND
-event is not reported when a name is changed inside the directory.
-.It Dv NOTE_LINK
-The link count on the file changed.
-In particular, the
-.Dv NOTE_LINK
-event is reported if a subdirectory was created or deleted inside
-the directory referenced by the descriptor.
-.It Dv NOTE_OPEN
-The file referenced by the descriptor was opened.
-.It Dv NOTE_READ
-A read occurred on the file referenced by the descriptor.
-.It Dv NOTE_RENAME
-The file referenced by the descriptor was renamed.
-.It Dv NOTE_REVOKE
-Access to the file was revoked via
-.Xr revoke 2
-or the underlying file system was unmounted.
-.It Dv NOTE_WRITE
-A write occurred on the file referenced by the descriptor.
-.El
-.Pp
-On return,
-.Va fflags
-contains the events which triggered the filter.
-.It Dv EVFILT_PROC
-Takes the process ID to monitor as the identifier and the events to watch for
-in
-.Va fflags ,
-and returns when the process performs one or more of the requested events.
-If a process can normally see another process, it can attach an event to it.
-The events to monitor are:
-.Bl -tag -width "Dv NOTE_TRACKERR"
-.It Dv NOTE_EXIT
-The process has exited.
-The exit status will be stored in
-.Va data
-in the same format as the status returned by
-.Xr wait 2 .
-.It Dv NOTE_FORK
-The process has called
-.Fn fork .
-.It Dv NOTE_EXEC
-The process has executed a new process via
-.Xr execve 2
-or a similar call.
-.It Dv NOTE_TRACK
-Follow a process across
-.Fn fork
-calls.
-The parent process registers a new kevent to monitor the child process
-using the same
-.Va fflags
-as the original event.
-The child process will signal an event with
-.Dv NOTE_CHILD
-set in
-.Va fflags
-and the parent PID in
-.Va data .
-.Pp
-If the parent process fails to register a new kevent
-.Pq usually due to resource limitations ,
-it will signal an event with
-.Dv NOTE_TRACKERR
-set in
-.Va fflags ,
-and the child process will not signal a
-.Dv NOTE_CHILD
-event.
-.El
-.Pp
-On return,
-.Va fflags
-contains the events which triggered the filter.
-.It Dv EVFILT_PROCDESC
-Takes the process descriptor created by
-.Xr pdfork 2
-to monitor as the identifier and the events to watch for in
-.Va fflags ,
-and returns when the associated process performs one or more of the
-requested events.
-The events to monitor are:
-.Bl -tag -width "Dv NOTE_EXIT"
-.It Dv NOTE_EXIT
-The process has exited.
-The exit status will be stored in
-.Va data .
-.El
-.Pp
-On return,
-.Va fflags
-contains the events which triggered the filter.
-.It Dv EVFILT_SIGNAL
-Takes the signal number to monitor as the identifier and returns
-when the given signal is delivered to the process.
-This coexists with the
-.Fn signal
-and
-.Fn sigaction
-facilities, and has a lower precedence.
-The filter will record
-all attempts to deliver a signal to a process, even if the signal has
-been marked as
-.Dv SIG_IGN ,
-except for the
-.Dv SIGCHLD
-signal, which, if ignored, will not be recorded by the filter.
-Event notification happens after normal
-signal delivery processing.
-.Va data
-returns the number of times the signal has occurred since the last call to
-.Fn kevent .
-This filter automatically sets the
-.Dv EV_CLEAR
-flag internally.
-.It Dv EVFILT_TIMER
-Establishes an arbitrary timer identified by
-.Va ident .
-When adding a timer,
-.Va data
-specifies the moment to fire the timer (for
-.Dv NOTE_ABSTIME )
-or the timeout period.
-The timer will be periodic unless
-.Dv EV_ONESHOT
-or
-.Dv NOTE_ABSTIME
-is specified.
-On return,
-.Va data
-contains the number of times the timeout has expired since the last call to
-.Fn kevent .
-For non-monotonic timers, this filter automatically sets the
-.Dv EV_CLEAR
-flag internally.
-.Pp
-The filter accepts the following flags in the
-.Va fflags
-argument:
-.Bl -tag -width "Dv NOTE_MSECONDS"
-.It Dv NOTE_SECONDS
-.Va data
-is in seconds.
-.It Dv NOTE_MSECONDS
-.Va data
-is in milliseconds.
-.It Dv NOTE_USECONDS
-.Va data
-is in microseconds.
-.It Dv NOTE_NSECONDS
-.Va data
-is in nanoseconds.
-.It Dv NOTE_ABSTIME
-The specified expiration time is absolute.
-.El
-.Pp
-If
-.Va fflags
-is not set, the default is milliseconds.
-On return,
-.Va fflags
-contains the events which triggered the filter.
-.Pp
-Periodic timers with a specified timeout of 0 will be silently adjusted to
-timeout after 1 of the time units specified by the requested precision in
-.Va fflags .
-If an absolute time is specified that has already passed, then it is treated as
-if the current time were specified and the event will fire as soon as possible.
-.Pp
-If an existing timer is re-added, the existing timer will be
-effectively canceled (throwing away any undelivered record of previous
-timer expiration) and re-started using the new parameters contained in
-.Va data
-and
-.Va fflags .
-.Pp
-There is a system wide limit on the number of timers
-which is controlled by the
-.Va kern.kq_calloutmax
-sysctl.
-.It Dv EVFILT_USER
-Establishes a user event identified by
-.Va ident
-which is not associated with any kernel mechanism but is triggered by
-user level code.
-The lower 24 bits of the
-.Va fflags
-may be used for user defined flags and manipulated using the following:
-.Bl -tag -width "Dv NOTE_FFLAGSMASK"
-.It Dv NOTE_FFNOP
-Ignore the input
-.Va fflags .
-.It Dv NOTE_FFAND
-Bitwise AND
-.Va fflags .
-.It Dv NOTE_FFOR
-Bitwise OR
-.Va fflags .
-.It Dv NOTE_FFCOPY
-Copy
-.Va fflags .
-.It Dv NOTE_FFCTRLMASK
-Control mask for
-.Va fflags .
-.It Dv NOTE_FFLAGSMASK
-User defined flag mask for
-.Va fflags .
-.El
-.Pp
-A user event is triggered for output with the following:
-.Bl -tag -width "Dv NOTE_FFLAGSMASK"
-.It Dv NOTE_TRIGGER
-Cause the event to be triggered.
-.El
-.Pp
-On return,
-.Va fflags
-contains the users defined flags in the lower 24 bits.
-.El
-.Sh CANCELLATION BEHAVIOUR
-If
-.Fa nevents
-is non-zero, i.e., the function is potentially blocking, the call
-is a cancellation point.
-Otherwise, i.e., if
-.Fa nevents
-is zero, the call is not cancellable.
-Cancellation can only occur before any changes are made to the kqueue,
-or when the call was blocked and no changes to the queue were requested.
-.Sh RETURN VALUES
-The
-.Fn kqueue
-system call
-creates a new kernel event queue and returns a file descriptor.
-If there was an error creating the kernel event queue, a value of -1 is
-returned and errno set.
-.Pp
-The
-.Fn kevent
-system call
-returns the number of events placed in the
-.Fa eventlist ,
-up to the value given by
-.Fa nevents .
-If an error occurs while processing an element of the
-.Fa changelist
-and there is enough room in the
-.Fa eventlist ,
-then the event will be placed in the
-.Fa eventlist
-with
-.Dv EV_ERROR
-set in
-.Va flags
-and the system error in
-.Va data .
-Otherwise,
-.Dv -1
-will be returned, and
-.Dv errno
-will be set to indicate the error condition.
-If the time limit expires, then
-.Fn kevent
-returns 0.
-.Sh EXAMPLES
-.Bd -literal -compact
-#include <sys/event.h>
-#include <err.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-int
-main(int argc, char **argv)
-{
- struct kevent event; /* Event we want to monitor */
- struct kevent tevent; /* Event triggered */
- int kq, fd, ret;
-
- if (argc != 2)
- err(EXIT_FAILURE, "Usage: %s path\en", argv[0]);
- fd = open(argv[1], O_RDONLY);
- if (fd == -1)
- err(EXIT_FAILURE, "Failed to open '%s'", argv[1]);
-
- /* Create kqueue. */
- kq = kqueue();
- if (kq == -1)
- err(EXIT_FAILURE, "kqueue() failed");
-
- /* Initialize kevent structure. */
- EV_SET(&event, fd, EVFILT_VNODE, EV_ADD | EV_CLEAR, NOTE_WRITE,
- 0, NULL);
- /* Attach event to the kqueue. */
- ret = kevent(kq, &event, 1, NULL, 0, NULL);
- if (ret == -1)
- err(EXIT_FAILURE, "kevent register");
-
- for (;;) {
- /* Sleep until something happens. */
- ret = kevent(kq, NULL, 0, &tevent, 1, NULL);
- if (ret == -1) {
- err(EXIT_FAILURE, "kevent wait");
- } else if (ret > 0) {
- if (tevent.flags & EV_ERROR)
- errx(EXIT_FAILURE, "Event error: %s", strerror(event.data));
- else
- printf("Something was written in '%s'\en", argv[1]);
- }
- }
-
- /* kqueues are destroyed upon close() */
- (void)close(kq);
- (void)close(fd);
-}
-.Ed
-.Sh ERRORS
-The
-.Fn kqueue
-system call fails if:
-.Bl -tag -width Er
-.It Bq Er ENOMEM
-The kernel failed to allocate enough memory for the kernel queue.
-.It Bq Er ENOMEM
-The
-.Dv RLIMIT_KQUEUES
-rlimit
-(see
-.Xr getrlimit 2 )
-for the current user would be exceeded.
-.It Bq Er EMFILE
-The per-process descriptor table is full.
-.It Bq Er ENFILE
-The system file table is full.
-.El
-.Pp
-The
-.Fn kevent
-system call fails if:
-.Bl -tag -width Er
-.It Bq Er EACCES
-The process does not have permission to register a filter.
-.It Bq Er EFAULT
-There was an error reading or writing the
-.Va kevent
-structure.
-.It Bq Er EBADF
-The specified descriptor is invalid.
-.It Bq Er EINTR
-A signal was delivered before the timeout expired and before any
-events were placed on the kqueue for return.
-.It Bq Er EINTR
-A cancellation request was delivered to the thread, but not yet handled.
-.It Bq Er EINVAL
-The specified time limit or filter is invalid.
-.It Bq Er EINVAL
-The specified length of the event or change lists is negative.
-.It Bq Er ENOENT
-The event could not be found to be modified or deleted.
-.It Bq Er ENOMEM
-No memory was available to register the event
-or, in the special case of a timer, the maximum number of
-timers has been exceeded.
-This maximum is configurable via the
-.Va kern.kq_calloutmax
-sysctl.
-.It Bq Er ESRCH
-The specified process to attach to does not exist.
-.El
-.Pp
-When
-.Fn kevent
-call fails with
-.Er EINTR
-error, all changes in the
-.Fa changelist
-have been applied.
-.Sh SEE ALSO
-.Xr aio_error 2 ,
-.Xr aio_read 2 ,
-.Xr aio_return 2 ,
-.Xr poll 2 ,
-.Xr read 2 ,
-.Xr select 2 ,
-.Xr sigaction 2 ,
-.Xr write 2 ,
-.Xr pthread_setcancelstate 3 ,
-.Xr signal 3
-.Rs
-.%A Jonathan Lemon
-.%T "Kqueue: A Generic and Scalable Event Notification Facility"
-.%I USENIX Association
-.%B Proceedings of the FREENIX Track: 2001 USENIX Annual Technical Conference
-.%D June 25-30, 2001
-.\".http://www.usenix.org/event/usenix01/freenix01/full_papers/lemon/lemon.pdf
-.Re
-.Sh HISTORY
-The
-.Fn kqueue
-and
-.Fn kevent
-system calls first appeared in
-.Fx 4.1 .
-.Sh AUTHORS
-The
-.Fn kqueue
-system and this manual page were written by
-.An Jonathan Lemon Aq Mt jlemon@FreeBSD.org .
-.Sh BUGS
-.Pp
-In versions older than
-.Fx 12.0 ,
-.In sys/event.h
-failed to parse without including
-.In sys/types.h
-manually.