Fix mdoc(7)/man(7) mix up.
[netbsd-mini2440.git] / lib / libc / sys / kqueue.2
blob9053c415a0302aec4ca8668c794756ea661c9076
1 .\"     $NetBSD: kqueue.2,v 1.25 2009/10/24 17:49:58 christos Exp $
2 .\"
3 .\" Copyright (c) 2000 Jonathan Lemon
4 .\" All rights reserved.
5 .\"
6 .\" Copyright (c) 2001, 2002, 2003 The NetBSD Foundation, Inc.
7 .\" All rights reserved.
8 .\"
9 .\" Portions of this documentation is derived from text contributed by
10 .\" Luke Mewburn.
11 .\"
12 .\" Redistribution and use in source and binary forms, with or without
13 .\" modification, are permitted provided that the following conditions
14 .\" are met:
15 .\" 1. Redistributions of source code must retain the above copyright
16 .\"    notice, this list of conditions and the following disclaimer.
17 .\" 2. Redistributions in binary form must reproduce the above copyright
18 .\"    notice, this list of conditions and the following disclaimer in the
19 .\"    documentation and/or other materials provided with the distribution.
20 .\"
21 .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND
22 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
25 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 .\" SUCH DAMAGE.
32 .\"
33 .\" $FreeBSD: src/lib/libc/sys/kqueue.2,v 1.22 2001/06/27 19:55:57 dd Exp $
34 .\"
35 .Dd October 24, 2009
36 .Dt KQUEUE 2
37 .Os
38 .Sh NAME
39 .Nm kqueue ,
40 .Nm kevent
41 .Nd kernel event notification mechanism
42 .Sh LIBRARY
43 .Lb libc
44 .Sh SYNOPSIS
45 .In sys/event.h
46 .In sys/time.h
47 .Ft int
48 .Fn kqueue "void"
49 .Ft int
50 .Fn kevent "int kq" "const struct kevent *changelist" "size_t nchanges" "struct kevent *eventlist" "size_t nevents" "const struct timespec *timeout"
51 .Fn EV_SET "\*[Am]kev" ident filter flags fflags data udata
52 .Sh DESCRIPTION
53 .Fn kqueue
54 provides a generic method of notifying the user when an event
55 happens or a condition holds, based on the results of small
56 pieces of kernel code termed filters.
57 A kevent is identified by the (ident, filter) pair; there may only
58 be one unique kevent per kqueue.
59 .Pp
60 The filter is executed upon the initial registration of a kevent
61 in order to detect whether a preexisting condition is present, and is also
62 executed whenever an event is passed to the filter for evaluation.
63 If the filter determines that the condition should be reported,
64 then the kevent is placed on the kqueue for the user to retrieve.
65 .Pp
66 The filter is also run when the user attempts to retrieve the kevent
67 from the kqueue.
68 If the filter indicates that the condition that triggered
69 the event no longer holds, the kevent is removed from the kqueue and
70 is not returned.
71 .Pp
72 Multiple events which trigger the filter do not result in multiple
73 kevents being placed on the kqueue; instead, the filter will aggregate
74 the events into a single struct kevent.
75 Calling
76 .Fn close
77 on a file descriptor will remove any kevents that reference the descriptor.
78 .Pp
79 .Fn kqueue
80 creates a new kernel event queue and returns a descriptor.
81 The queue is not inherited by a child created with
82 .Xr fork 2 .
83 .\" However, if
84 .\" .Xr rfork 2
85 .\" is called without the
86 .\" .Dv RFFDG
87 .\" flag, then the descriptor table is shared,
88 .\" which will allow sharing of the kqueue between two processes.
89 .Pp
90 .Fn kevent
91 is used to register events with the queue, and return any pending
92 events to the user.
93 .Fa changelist
94 is a pointer to an array of
95 .Va kevent
96 structures, as defined in
97 .Aq Pa sys/event.h .
98 All changes contained in the
99 .Fa changelist
100 are applied before any pending events are read from the queue.
101 .Fa nchanges
102 gives the size of
103 .Fa changelist .
104 .Fa eventlist
105 is a pointer to an array of kevent structures.
106 .Fa nevents
107 determines the size of
108 .Fa eventlist .
110 .Fa timeout
111 is a
112 .No non- Ns Dv NULL
113 pointer, it specifies a maximum interval to wait
114 for an event, which will be interpreted as a struct timespec.
116 .Fa timeout
117 is a
118 .Dv NULL
119 pointer,
120 .Fn kevent
121 waits indefinitely.
122 To effect a poll, the
123 .Fa timeout
124 argument should be
125 .No non- Ns Dv NULL ,
126 pointing to a zero-valued
127 .Va timespec
128 structure.
129 The same array may be used for the
130 .Fa changelist
132 .Fa eventlist .
134 .Fn EV_SET
135 is a macro which is provided for ease of initializing a
136 kevent structure.
139 .Va kevent
140 structure is defined as:
141 .Bd -literal
142 struct kevent {
143         uintptr_t ident;        /* identifier for this event */
144         uint32_t  filter;       /* filter for event */
145         uint32_t  flags;        /* action flags for kqueue */
146         uint32_t  fflags;       /* filter flag value */
147         int64_t   data;         /* filter data value */
148         intptr_t  udata;        /* opaque user data identifier */
152 The fields of
153 .Fa struct kevent
154 are:
155 .Bl -tag -width XXXfilter -offset indent
156 .It ident
157 Value used to identify this event.
158 The exact interpretation is determined by the attached filter,
159 but often is a file descriptor.
160 .It filter
161 Identifies the kernel filter used to process this event.
162 There are pre-defined system filters (which are described below), and
163 other filters may be added by kernel subsystems as necessary.
164 .It flags
165 Actions to perform on the event.
166 .It fflags
167 Filter-specific flags.
168 .It data
169 Filter-specific data value.
170 .It udata
171 Opaque user-defined value passed through the kernel unchanged.
175 .Va flags
176 field can contain the following values:
177 .Bl -tag -width XXXEV_ONESHOT -offset indent
178 .It EV_ADD
179 Adds the event to the kqueue.
180 Re-adding an existing event will modify the parameters of the original
181 event, and not result in a duplicate entry.
182 Adding an event automatically enables it,
183 unless overridden by the EV_DISABLE flag.
184 .It EV_ENABLE
185 Permit
186 .Fn kevent
187 to return the event if it is triggered.
188 .It EV_DISABLE
189 Disable the event so
190 .Fn kevent
191 will not return it.
192 The filter itself is not disabled.
193 .It EV_DELETE
194 Removes the event from the kqueue.
195 Events which are attached to file descriptors are automatically deleted
196 on the last close of the descriptor.
197 .It EV_ONESHOT
198 Causes the event to return only the first occurrence of the filter
199 being triggered.
200 After the user retrieves the event from the kqueue, it is deleted.
201 .It EV_CLEAR
202 After the event is retrieved by the user, its state is reset.
203 This is useful for filters which report state transitions
204 instead of the current state.
205 Note that some filters may automatically set this flag internally.
206 .It EV_EOF
207 Filters may set this flag to indicate filter-specific EOF condition.
208 .It EV_ERROR
210 .Sx RETURN VALUES
211 below.
213 .Ss Filters
214 Filters are identified by a number.
215 There are two types of filters; pre-defined filters which
216 are described below, and third-party filters that may be added with
217 .Xr kfilter_register 9
218 by kernel sub-systems, third-party device drivers, or loadable
219 kernel modules.
221 As a third-party filter is referenced by a well-known name instead
222 of a statically assigned number, two
223 .Xr ioctl 2 Ns s
224 are supported on the file descriptor returned by
225 .Fn kqueue
226 to map a filter name to a filter number, and vice-versa (passing
227 arguments in a structure described below):
228 .Bl -tag -width KFILTER_BYFILTER -offset indent
229 .It KFILTER_BYFILTER
231 .Va filter
233 .Va name ,
234 which is of size
235 .Va len .
236 .It KFILTER_BYNAME
238 .Va name
240 .Va filter .
241 .Va len
242 is ignored.
245 The following structure is used to pass arguments in and out of the
246 .Xr ioctl 2 :
247 .Bd -literal -offset indent
248 struct kfilter_mapping {
249         char     *name;         /* name to lookup or return */
250         size_t   len;           /* length of name */
251         uint32_t filter;        /* filter to lookup or return */
255 Arguments may be passed to and from the filter via the
256 .Va fflags
258 .Va data
259 fields in the kevent structure.
261 The predefined system filters are:
262 .Bl -tag -width EVFILT_SIGNAL
263 .It EVFILT_READ
264 Takes a descriptor as the identifier, and returns whenever
265 there is data available to read.
266 The behavior of the filter is slightly different depending
267 on the descriptor type.
269 .Bl -tag -width 2n
270 .It Sockets
271 Sockets which have previously been passed to
272 .Fn listen
273 return when there is an incoming connection pending.
274 .Va data
275 contains the size of the listen backlog (i.e., the number of
276 connections ready to be accepted with
277 .Xr accept 2 . )
279 Other socket descriptors return when there is data to be read,
280 subject to the
281 .Dv SO_RCVLOWAT
282 value of the socket buffer.
283 This may be overridden with a per-filter low water mark at the
284 time the filter is added by setting the
285 NOTE_LOWAT
286 flag in
287 .Va fflags ,
288 and specifying the new low water mark in
289 .Va data .
290 On return,
291 .Va data
292 contains the number of bytes in the socket buffer.
294 If the read direction of the socket has shutdown, then the filter
295 also sets EV_EOF in
296 .Va flags ,
297 and returns the socket error (if any) in
298 .Va fflags .
299 It is possible for EOF to be returned (indicating the connection is gone)
300 while there is still data pending in the socket buffer.
301 .It Vnodes
302 Returns when the file pointer is not at the end of file.
303 .Va data
304 contains the offset from current position to end of file,
305 and may be negative.
306 .It "Fifos, Pipes"
307 Returns when there is data to read;
308 .Va data
309 contains the number of bytes available.
311 When the last writer disconnects, the filter will set EV_EOF in
312 .Va flags .
313 This may be cleared by passing in EV_CLEAR, at which point the
314 filter will resume waiting for data to become available before
315 returning.
317 .It EVFILT_WRITE
318 Takes a descriptor as the identifier, and returns whenever
319 it is possible to write to the descriptor.
320 For sockets, pipes, fifos, and ttys,
321 .Va data
322 will contain the amount of space remaining in the write buffer.
323 The filter will set EV_EOF when the reader disconnects, and for
324 the fifo case, this may be cleared by use of EV_CLEAR.
325 Note that this filter is not supported for vnodes.
327 For sockets, the low water mark and socket error handling is
328 identical to the EVFILT_READ case.
329 .It EVFILT_AIO
330 This is not implemented in
331 .Nx .
333 The sigevent portion of the AIO request is filled in, with
334 .Va sigev_notify_kqueue
335 containing the descriptor of the kqueue that the event should
336 be attached to,
337 .Va sigev_value
338 containing the udata value, and
339 .Va sigev_notify
340 set to SIGEV_EVENT.
341 When the aio_* function is called, the event will be registered
342 with the specified kqueue, and the
343 .Va ident
344 argument set to the
345 .Fa struct aiocb
346 returned by the aio_* function.
347 The filter returns under the same conditions as aio_error.
349 Alternatively, a kevent structure may be initialized, with
350 .Va ident
351 containing the descriptor of the kqueue, and the
352 address of the kevent structure placed in the
353 .Va aio_lio_opcode
354 field of the AIO request.
355 However, this approach will not work on
356 architectures with 64-bit pointers, and should be considered deprecated.
358 .It EVFILT_VNODE
359 Takes a file descriptor as the identifier and the events to watch for in
360 .Va fflags ,
361 and returns when one or more of the requested events occurs on the descriptor.
362 The events to monitor are:
363 .Bl -tag -width XXNOTE_RENAME
364 .It NOTE_DELETE
365 .Fn unlink
366 was called on the file referenced by the descriptor.
367 .It NOTE_WRITE
368 A write occurred on the file referenced by the descriptor.
369 .It NOTE_EXTEND
370 The file referenced by the descriptor was extended.
371 .It NOTE_ATTRIB
372 The file referenced by the descriptor had its attributes changed.
373 .It NOTE_LINK
374 The link count on the file changed.
375 .It NOTE_RENAME
376 The file referenced by the descriptor was renamed.
377 .It NOTE_REVOKE
378 Access to the file was revoked via
379 .Xr revoke 2
380 or the underlying fileystem was unmounted.
383 On return,
384 .Va fflags
385 contains the events which triggered the filter.
386 .It EVFILT_PROC
387 Takes the process ID to monitor as the identifier and the events to watch for
389 .Va fflags ,
390 and returns when the process performs one or more of the requested events.
391 If a process can normally see another process, it can attach an event to it.
392 The events to monitor are:
393 .Bl -tag -width XXNOTE_TRACKERR
394 .It NOTE_EXIT
395 The process has exited.
396 .It NOTE_FORK
397 The process has called
398 .Fn fork .
399 .It NOTE_EXEC
400 The process has executed a new process via
401 .Xr execve 2
402 or similar call.
403 .It NOTE_TRACK
404 Follow a process across
405 .Fn fork
406 calls.
407 The parent process will return with NOTE_TRACK set in the
408 .Va fflags
409 field, while the child process will return with NOTE_CHILD set in
410 .Va fflags
411 and the parent PID in
412 .Va data .
413 .It NOTE_TRACKERR
414 This flag is returned if the system was unable to attach an event to
415 the child process, usually due to resource limitations.
418 On return,
419 .Va fflags
420 contains the events which triggered the filter.
421 .It EVFILT_SIGNAL
422 Takes the signal number to monitor as the identifier and returns
423 when the given signal is delivered to the current process.
424 This coexists with the
425 .Fn signal
427 .Fn sigaction
428 facilities, and has a lower precedence.
429 The filter will record
430 all attempts to deliver a signal to a process, even if the signal has
431 been marked as SIG_IGN.
432 Event notification happens after normal signal delivery processing.
433 .Va data
434 returns the number of times the signal has occurred since the last call to
435 .Fn kevent .
436 This filter automatically sets the EV_CLEAR flag internally.
437 .It EVFILT_TIMER
438 Establishes an arbitrary timer identified by
439 .Va ident .
440 When adding a timer,
441 .Va data
442 specifies the timeout period in milliseconds.
443 The timer will be periodic unless EV_ONESHOT is specified.
444 On return,
445 .Va data
446 contains the number of times the timeout has expired since the last call to
447 .Fn kevent .
448 This filter automatically sets the EV_CLEAR flag internally.
450 .Sh RETURN VALUES
451 .Fn kqueue
452 creates a new kernel event queue and returns a file descriptor.
453 If there was an error creating the kernel event queue, a value of \-1 is
454 returned and errno set.
456 .Fn kevent
457 returns the number of events placed in the
458 .Fa eventlist ,
459 up to the value given by
460 .Fa nevents .
461 If an error occurs while processing an element of the
462 .Fa changelist
463 and there is enough room in the
464 .Fa eventlist ,
465 then the event will be placed in the
466 .Fa eventlist
467 with
468 .Dv EV_ERROR
469 set in
470 .Va flags
471 and the system error in
472 .Va data .
473 Otherwise,
474 .Dv \-1
475 will be returned, and
476 .Dv errno
477 will be set to indicate the error condition.
478 If the time limit expires, then
479 .Fn kevent
480 returns 0.
481 .Sh EXAMPLES
482 The following example program monitors a file (provided to it as the first
483 argument) and prints information about some common events it receives
484 notifications for:
485 .Bd -literal -offset indent
486 #include \*[Lt]sys/types.h\*[Gt]
487 #include \*[Lt]sys/event.h\*[Gt]
488 #include \*[Lt]sys/time.h\*[Gt]
489 #include \*[Lt]stdio.h\*[Gt]
490 #include \*[Lt]unistd.h\*[Gt]
491 #include \*[Lt]stdlib.h\*[Gt]
492 #include \*[Lt]fcntl.h\*[Gt]
493 #include \*[Lt]err.h\*[Gt]
496 main(int argc, char *argv[])
498         int fd, kq, nev;
499         struct kevent ev;
500         static const struct timespec tout = { 1, 0 };
502         if ((fd = open(argv[1], O_RDONLY)) == -1)
503                 err(1, "Cannot open `%s'", argv[1]);
505         if ((kq = kqueue()) == -1)
506                 err(1, "Cannot create kqueue");
508         EV_SET(\*[Am]ev, fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
509             NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK|
510             NOTE_RENAME|NOTE_REVOKE, 0, 0);
511         if (kevent(kq, \*[Am]ch, 1, NULL, 0, \*[Am]tout) == -1)
512                 err(1, "kevent");
513         for (;;) {
514                 nev = kevent(kq, NULL, 0, \*[Am]ev, 1, \*[Am]tout);
515                 if (nev == -1)
516                         err(1, "kevent");
517                 if (nev == 0)
518                         continue;
519                 if (ev.fflags \*[Am] NOTE_DELETE) {
520                         printf("deleted ");
521                         ev.fflags \*[Am]= ~NOTE_DELETE;
522                 }
523                 if (ev.fflags \*[Am] NOTE_WRITE) {
524                         printf("written ");
525                         ev.fflags \*[Am]= ~NOTE_WRITE;
526                 }
527                 if (ev.fflags \*[Am] NOTE_EXTEND) {
528                         printf("extended ");
529                         ev.fflags \*[Am]= ~NOTE_EXTEND;
530                 }
531                 if (ev.fflags \*[Am] NOTE_ATTRIB) {
532                         printf("chmod/chown/utimes ");
533                         ev.fflags \*[Am]= ~NOTE_ATTRIB;
534                 }
535                 if (ev.fflags \*[Am] NOTE_LINK) {
536                         printf("hardlinked ");
537                         ev.fflags \*[Am]= ~NOTE_LINK;
538                 }
539                 if (ev.fflags \*[Am] NOTE_RENAME) {
540                         printf("renamed ");
541                         ev.fflags \*[Am]= ~NOTE_RENAME;
542                 }
543                 if (ev.fflags \*[Am] NOTE_REVOKE) {
544                         printf("revoked ");
545                         ev.fflags \*[Am]= ~NOTE_REVOKE;
546                 }
547                 printf("\\n");
548                 if (ev.fflags)
549                         warnx("unknown event 0x%x\\n", ev.fflags);
550         }
553 .Sh ERRORS
555 .Fn kqueue
556 function fails if:
557 .Bl -tag -width Er
558 .It Bq Er EMFILE
559 The per-process descriptor table is full.
560 .It Bq Er ENFILE
561 The system file table is full.
562 .It Bq Er ENOMEM
563 The kernel failed to allocate enough memory for the kernel queue.
567 .Fn kevent
568 function fails if:
569 .Bl -tag -width Er
570 .It Bq Er EACCES
571 The process does not have permission to register a filter.
572 .It Bq Er EBADF
573 The specified descriptor is invalid.
574 .It Bq Er EFAULT
575 There was an error reading or writing the
576 .Va kevent
577 structure.
578 .It Bq Er EINTR
579 A signal was delivered before the timeout expired and before any
580 events were placed on the kqueue for return.
581 .It Bq Er EINVAL
582 The specified time limit or filter is invalid.
583 .It Bq Er ENOENT
584 The event could not be found to be modified or deleted.
585 .It Bq Er ENOMEM
586 No memory was available to register the event.
587 .It Bq Er ESRCH
588 The specified process to attach to does not exist.
590 .Sh SEE ALSO
591 .\" .Xr aio_error 2 ,
592 .\" .Xr aio_read 2 ,
593 .\" .Xr aio_return 2 ,
594 .Xr ioctl 2 ,
595 .Xr poll 2 ,
596 .Xr read 2 ,
597 .Xr select 2 ,
598 .Xr sigaction 2 ,
599 .Xr write 2 ,
600 .Xr signal 3 ,
601 .Xr kfilter_register 9 ,
602 .Xr knote 9
603 .Sh HISTORY
605 .Fn kqueue
607 .Fn kevent
608 functions first appeared in
609 .Fx 4.1 ,
610 and then in
611 .Nx 2.0 .