home | help
KQUEUE(2)		       System Calls Manual		       KQUEUE(2)

NAME
     kqueue, kevent -- kernel event notification mechanism

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <sys/types.h>
     #include <sys/event.h>
     #include <sys/time.h>

     int
     kqueue(void);

     int
     kevent(int kq, const struct kevent *changelist, int nchanges,
	 struct kevent *eventlist, int nevents, const struct timespec *timeout);

     EV_SET(&kev, ident, filter, flags, fflags, data, udata);

DESCRIPTION
     kqueue() provides a generic method of notifying the user when an event hap-
     pens  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.

     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.

     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 re-
     turned.

     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 close() on a file descriptor will re-
     move any kevents that reference the descriptor.

     kqueue() creates a new kernel event queue and returns  a  descriptor.   The
     queue  is	not  inherited	by  a  child  created with fork(2).  However, if
     rfork(2) is called without the RFFDG flag, then  the  descriptor  table  is
     shared, which will allow sharing of the kqueue between two processes.

     kevent()  is used to register events with the queue, and return any pending
     events to the user.  changelist is a pointer to an array of  kevent  struc-
     tures,   as  defined  in  <sys/event.h>.	All  changes  contained  in  the
     changelist are applied before any pending events are read from  the  queue.
     nchanges  gives the size of changelist.  eventlist is a pointer to an array
     of kevent structures.   nevents  determines  the  size  of  eventlist.   If
     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 timeout is  a
     NULL  pointer,  kevent() waits indefinitely.  To effect a poll, the timeout
     argument should be non-NULL, pointing to a zero-valued timespec  structure.
     The same array may be used for the changelist and eventlist.

     EV_SET()  is  a  macro  which is provided for ease of initializing a kevent
     structure.

     The kevent structure is defined as:

     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 */
	     intptr_t  data;	     /* filter data value */
	     void      *udata;	     /* opaque user data identifier */
     };

     The fields of struct kevent are:

     ident	Value used to identify this event.  The exact interpretation  is
		determined  by the attached filter, but often is a file descrip-
		tor.

     filter	Identifies the kernel filter used to process  this  event.   The
		pre-defined system filters are described below.

     flags	Actions to perform on the event.

     fflags	Filter-specific flags.

     data	Filter-specific data value.

     udata	Opaque user-defined value passed through the kernel unchanged.

     The flags field can contain the following values:

     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.

     EV_ENABLE	    Permit kevent() to return the event if it is triggered.

     EV_DISABLE     Disable the event so kevent() will not return it.  The  fil-
		    ter itself is not disabled.

     EV_DELETE	    Removes  the  event  from  the kqueue.  Events which are at-
		    tached to file descriptors are automatically deleted on  the
		    last close of the descriptor.

     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.

     EV_CLEAR	    After  the	event is retrieved by the user, its state is re-
		    set.  This is useful for filters which report state  transi-
		    tions  instead of the current state.  Note that some filters
		    may automatically set this flag internally.

     EV_EOF	    Filters may set this flag to  indicate  filter-specific  EOF
		    condition.

     EV_ERROR	    See "RETURN VALUES" below.

     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.

     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.

		    Sockets
			Sockets which have previously been  passed  to	listen()
			return	when  there  is  an incoming connection pending.
			data contains the size of the listen backlog.

			Other socket descriptors return when there is data to be
			read, subject to the 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  NOTE_LOWAT  flag  in fflags, and specifying the new
			low water mark in data.  On return,  data  contains  the
			number of bytes in the socket buffer.

			If  the  read direction of the socket has shutdown, then
			the filter also sets EV_EOF in flags,  and  returns  the
			socket error (if any) in fflags.  It is possible for EOF
			to be returned (indicating the connection is gone) while
			there is still data pending in the socket buffer.

		    Vnodes
			Returns when the file pointer is not at the end of file.
			data contains the offset from current position to end of
			file, and may be negative.

		    Fifos, Pipes
			Returns  when  the  there is data to read; data contains
			the number of bytes available.

			When the last writer disconnects, the  filter  will  set
			EV_EOF	in  flags.   This  may	be cleared by passing in
			EV_CLEAR, at which point the filter will resume  waiting
			for data to become available before returning.

     EVFILT_WRITE   Takes  a  descriptor as the identifier, and returns whenever
		    it is possible to write to	the  descriptor.   For	sockets,
		    pipes  and	fifos, data will contain the amount of space re-
		    maining in the write buffer.  The  filter  will  set  EV_EOF
		    when the reader disconnects, and for the fifo case, this may
		    be cleared by use of EV_CLEAR.  Note that this filter is not
		    supported for vnodes.

		    For sockets, the low water mark and socket error handling is
		    identical to the EVFILT_READ case.

     EVFILT_AIO     The  sigevent  portion of the AIO request is filled in, with
		    sigev_notify_kqueue containing the descriptor of the  kqueue
		    that the event should be attached to, sigev_value containing
		    the udata value, and sigev_notify set to SIGEV_KEVENT.  When
		    the  aio_*	function is called, the event will be registered
		    with the specified kqueue, and the ident argument set to the
		    struct aiocb returned by the aio_* function.  The filter re-
		    turns under the same conditions as aio_error.

		    Alternatively, a kevent structure may be  initialized,  with
		    ident  containing  the descriptor of the kqueue, and the ad-
		    dress of the kevent structure placed in  the  aio_lio_opcode
		    field  of  the AIO request.  However, this approach will not
		    work on architectures with 64-bit pointers,  and  should  be
		    considered depreciated.

     EVFILT_VNODE   Takes  a file descriptor as the identifier and the events to
		    watch for in fflags, and returns when one or more of the re-
		    quested events occurs on the descriptor.  The events to mon-
		    itor are:

		    NOTE_DELETE    unlink() was called on the file referenced by
				   the descriptor.

		    NOTE_WRITE	   A write occurred on the  file  referenced  by
				   the descriptor.

		    NOTE_EXTEND    The file referenced by the descriptor was ex-
				   tended.

		    NOTE_ATTRIB    The file referenced by the descriptor had its
				   attributes changed.

		    NOTE_LINK	   The link count on the file changed.

		    NOTE_RENAME    The file referenced by the descriptor was re-
				   named.

		    NOTE_REVOKE    Access  to the file was revoked via revoke(2)
				   or the underlying fileystem was unmounted.

		    On return, fflags contains the events  which  triggered  the
		    filter.

     EVFILT_PROC    Takes  the	process  ID to monitor as the identifier and the
		    events to watch for in 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:

		    NOTE_EXIT	     The process has exited.

		    NOTE_FORK	     The process has called fork().

		    NOTE_EXEC	     The  process has executed a new process via
				     execve(2) or similar call.

		    NOTE_TRACK	     Follow a process across fork() calls.   The
				     parent  process will return with NOTE_TRACK
				     set in the fflags field,  while  the  child
				     process  will return with NOTE_CHILD set in
				     fflags and the parent PID in data.

		    NOTE_TRACKERR    This flag is returned if the system was un-
				     able  to  attach  an  event  to  the  child
				     process,  usually	due  to resource limita-
				     tions.

		    On return, fflags contains the events  which  triggered  the
		    filter.

     EVFILT_SIGNAL  Takes the signal number to monitor as the identifier and re-
		    turns  when  the  given  signal is delivered to the process.
		    This coexists with the signal() and sigaction()  facilities,
		    and  has a lower precedence.  The filter will record all at-
		    tempts to deliver a signal to a process, even if the  signal
		    has  been marked as SIG_IGN.  Event notification happens af-
		    ter normal signal delivery	processing.   data  returns  the
		    number  of times the signal has occurred since the last call
		    to kevent().  This filter automatically  sets  the	EV_CLEAR
		    flag internally.

     EVFILT_TIMER   Establishes  an  arbitrary	timer identified by ident.  When
		    adding a timer, data specifies the timeout	period	in  mil-
		    liseconds.	 The timer will be periodic unless EV_ONESHOT is
		    specified.	On return, data contains the number of times the
		    timeout has expired since the last call to	kevent().   This
		    filter automatically sets the EV_CLEAR flag internally.

RETURN VALUES
     kqueue()  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 re-
     turned and errno set.

     kevent() returns the number of events placed in the eventlist,  up  to  the
     value  given by nevents.  If an error occurs while processing an element of
     the changelist and there is enough room in the eventlist,	then  the  event
     will  be  placed in the eventlist with EV_ERROR set in flags and the system
     error in data.  Otherwise, -1 will be returned, and errno will  be  set  to
     indicate the error condition.  If the time limit expires, then kevent() re-
     turns 0.

ERRORS
     The kqueue() function fails if:

     [ENOMEM]		The kernel failed to allocate enough memory for the ker-
			nel queue.

     [EMFILE]		The per-process descriptor table is full.

     [ENFILE]		The system file table is full.

     The kevent() function fails if:

     [EACCES]		The  process does not have permission to register a fil-
			ter.

     [EFAULT]		There was an error reading or writing the kevent  struc-
			ture.

     [EBADF]		The specified descriptor is invalid.

     [EINTR]		A  signal  was	delivered before the timeout expired and
			before any events were placed on the kqueue for return.

     [EINVAL]		The specified time limit or filter is invalid.

     [ENOENT]		The event could not be found to be modified or deleted.

     [ENOMEM]		No memory was available to register the event.

     [ESRCH]		The specified process to attach to does not exist.

SEE ALSO
     aio_error(2),  aio_read(2),  aio_return(2),  poll(2),  read(2),  select(2),
     sigaction(2), write(2), signal(3)

HISTORY
     The kqueue() and kevent() functions first appeared in FreeBSD 4.1.

AUTHORS
     The  kqueue()  system  and  this manual page were written by Jonathan Lemon
     <jlemon@FreeBSD.org>.

BUGS
     It is currently not possible to watch a vnode(9) that resides  on	anything
     but a UFS file system.

FreeBSD 4.7			 April 14, 2000 		       KQUEUE(2)

home | help