📄 event.3
字号:
.\" $OpenBSD: event.3,v 1.4 2002/07/12 18:50:48 provos Exp $.\".\" Copyright (c) 2000 Artur Grabowski <art@openbsd.org>.\" 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..\" 3. The name of the author may not be used to endorse or promote products.\" derived from this software without specific prior written permission..\".\" 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 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 August 8, 2000.Dt EVENT 3.Os.Sh NAME.Nm event_init ,.Nm event_dispatch ,.Nm event_loop ,.Nm event_loopexit ,.Nm event_base_loop ,.Nm event_base_loopexit ,.Nm event_set ,.Nm event_add ,.Nm event_del ,.Nm event_once ,.Nm event_pending ,.Nm event_initialized ,.Nm event_priority_init ,.Nm event_priority_set ,.Nm evtimer_set ,.Nm evtimer_add ,.Nm evtimer_del.Nm evtimer_pending ,.Nm evtimer_initialized ,.Nm signal_set ,.Nm signal_add ,.Nm signal_del.Nm signal_pending ,.Nm signal_initialized ,.Nm bufferevent_new ,.Nm bufferevent_free ,.Nm bufferevent_write ,.Nm bufferevent_write_buffer ,.Nm bufferevent_read ,.Nm bufferevent_enable ,.Nm bufferevent_disable ,.Nm bufferevent_settimeout ,.Nm evbuffer_new ,.Nm evbuffer_free ,.Nm evbuffer_add ,.Nm evbuffer_add_buffer ,.Nm evbuffer_add_printf ,.Nm evbuffer_drain ,.Nm evbuffer_write ,.Nm evbuffer_read ,.Nm evbuffer_find ,.Nm evbuffer_readline.Nd execute a function when a specific event occurs.Sh SYNOPSIS.Fd #include <sys/time.h>.Fd #include <event.h>.Ft "struct event_base *".Fn "event_init".Ft int.Fn "event_dispatch".Ft int.Fn "event_loop" "int flags".Ft int.Fn "event_loopexit" "struct timeval *tv".Ft int.Fn "event_base_loop" "struct event_base *" "int flags".Ft int.Fn "event_base_loopexit" "struct event_base *" "struct timeval *tv".Ft void.Fn "event_set" "struct event *ev" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg".Ft int.Fn "event_add" "struct event *ev" "struct timeval *tv".Ft int.Fn "event_del" "struct event *ev".Ft int.Fn "event_once" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv".Ft int.Fn "event_pending" "struct event *ev" "short event" "struct timeval *tv".Ft int.Fn "event_initialized" "struct event *ev".Ft int.Fn "event_priority_init" "int npriorities".Ft int.Fn "event_priority_set" "struct event *ev" "int priority".Ft void.Fn "evtimer_set" "struct event *ev" "void (*fn)(int, short, void *)" "void *arg".Ft void.Fn "evtimer_add" "struct event *ev" "struct timeval *".Ft void.Fn "evtimer_del" "struct event *ev".Ft int.Fn "evtimer_pending" "struct event *ev" "struct timeval *tv".Ft int.Fn "evtimer_initialized" "struct event *ev".Ft void.Fn "signal_set" "struct event *ev" "int signal" "void (*fn)(int, short, void *)" "void *arg".Ft void.Fn "signal_add" "struct event *ev" "struct timeval *".Ft void.Fn "signal_del" "struct event *ev".Ft int.Fn "signal_pending" "struct event *ev" "struct timeval *tv".Ft int.Fn "signal_initialized" "struct event *ev".Ft "struct bufferevent *".Fn "bufferevent_new" "int fd" "evbuffercb readcb" "evbuffercb writecb" "everrorcb" "void *cbarg".Ft void.Fn "bufferevent_free" "struct bufferevent *bufev".Ft int.Fn "bufferevent_write" "struct bufferevent *bufev" "void *data" "size_t size".Ft int.Fn "bufferevent_write_buffer" "struct bufferevent *bufev" "struct evbuffer *buf".Ft size_t.Fn "bufferevent_read" "struct bufferevent *bufev" "void *data" "size_t size".Ft int.Fn "bufferevent_enable" "struct bufferevent *bufev" "short event".Ft int.Fn "bufferevent_disable" "struct bufferevent *bufev" "short event".Ft void.Fn "bufferevent_settimeout" "struct bufferevent *bufev" "int timeout_read" "int timeout_write".Ft "struct evbuffer *".Fn "evbuffer_new" "void".Ft void.Fn "evbuffer_free" "struct evbuffer *buf".Ft int.Fn "evbuffer_add" "struct evbuffer *buf" "u_char *data" "size_t size".Ft int.Fn "evbuffer_add_buffer" "struct evbuffer *dst" "struct evbuffer *src".Ft int.Fn "evbuffer_add_printf" "struct evbuffer *buf" "char *fmt" "...".Ft void.Fn "evbuffer_drain" "struct evbuffer *buf" "size_t size".Ft int.Fn "evbuffer_write" "struct evbuffer *buf" "int fd".Ft int.Fn "evbuffer_read" "struct evbuffer *buf" "int fd" "int size".Ft "u_char *".Fn "evbuffer_find" "struct evbuffer *buf" "u_char *data" "size_t size".Ft "char *".Fn "evbuffer_readline" "struct evbuffer *buf".Ft int.Fa (*event_sigcb)(void) ;.Ft int.Fa event_gotsig ;.Sh DESCRIPTIONThe.Nm eventAPI provides a mechanism to execute a function when a specific eventon a file descriptor occurs or after a given time has passed..PpThe.Nm eventAPI needs to be initialized with.Fn event_initbefore it can be used..PpIn order to process events, an application needs to call.Fn event_dispatch .This function only returns on error, and should replace the event coreof the application program..PpIn order to avoid races in signal handlers, the.Nm eventAPI provides two variables:.Va event_sigcband.Va event_gotsig .A signal handlersets.Va event_gotsigto indicate that a signal has been received.The application sets.Va event_sigcbto a callback function. After the signal handler sets.Va event_gotsig ,.Nm event_dispatchwill execute the callback function to process received signals. Thecallback returns 1 when no events are registered any more. It canreturn -1 to indicate an error to the.Nm eventlibrary, causing.Fn event_dispatchto terminate with.Va errnoset to.Er EINTR..PpThe.Nm event_loopfunction provides an interface for single pass execution of pendingevents. The flags.Va EVLOOP_ONCEand.Va EVLOOP_NONBLOCKare recognized.The.Nm event_loopexitfunction allows the loop to be terminated after some amount of timehas passed.The parameter indicates the time after which the loop should terminate..PpIt is the responsibility of the caller to provide these functions withpre-allocated event structures..PpThe function.Fn event_setprepares the event structure.Fa evto be used in future calls to.Fn event_addand.Fn event_del .The event will be prepared to call the function specified by the.Fa fnargument with an.Fa intargument indicating the file descriptor, a.Fa shortargument indicating the type of event, and a.Fa void *argument given in the.Fa argargument.The .Fa fdindicates the file descriptor that should be monitored for events.The events can be either.Va EV_READ ,.Va EV_WRITE ,or both.Indicating that an application can read or write from the file descriptorrespectively without blocking..PpThe function.Fa fnwill be called with the file descriptor that triggered the event andthe type of event which will be either.Va EV_TIMEOUT ,.Va EV_SIGNAL ,.Va EV_READ ,or.Va EV_WRITE .The additional flag.Va EV_PERSISTmakes an.Fn event_addpersistent until.Fn event_delhas been called..PpOnce initialized, the.Fa evstructure can be used repeatedly with.Fn event_addand.Fn event_deland does not need to be reinitialized unless the function called and/orthe argument to it are to be changed.However, when an .Fa evstructure has been added to libevent using .Fn event_addthe structure must persist until the event occurs (assuming .Fa EV_PERSIST is not set) or is removed using .Fn event_del . You may not reuse the same.Fa ev structure for multiple monitored descriptors; each descriptor needs its own.Fa ev ..PpThe function.Fn event_addschedules the execution of the.Fa evevent when the event specified in .Fn event_setoccurs or in at least the time specified in the.Fa tv .If.Fa tvis NULL, no timeout occurs and the function will only be calledif a matching event occurs on the file descriptor.The event in the.Fa evargument must be already initialized by.Fn event_setand may not be used in calls to.Fn event_setuntil it has timed out or been removed with.Fn event_del .If the event in the.Fa evargument already has a scheduled timeout, the old timeout will bereplaced by the new one..PpThe function.Fn event_delwill cancel the event in the argument.Fa ev .If the event has already executed or has never been addedthe call will have no effect..PpThe function.Fn event_onceis similar to.Fn event_set .However, it schedules a callback to be called exactly once and does notrequire the caller to prepare an.Fa eventstructure.This function supports.Fa EV_TIMEOUT ,.Fa EV_READand.Fa EV_WRITE ..PpThe.Fn event_pendingfunction can be used to check if the event specified by.Fa eventis pending to run.If.Va EV_TIMEOUTwas specified and .Fa tvis not.Va NULL ,the expiration time of the event will be returned in.Fa tv ..PpThe.Fn event_initializedmacro can be used to check if an event has been initialized..PpThe functions.Fn evtimer_set ,.Fn evtimer_add ,.Fn evtimer_del ,.Fn evtimer_initialized ,and.Fn evtimer_pendingare abbreviations for common situations where only a timeout is required.The file descriptor passed will be -1, and the event type will be.Va EV_TIMEOUT ..Pp.PpThe functions.Fn signal_set ,.Fn signal_add ,.Fn signal_del ,.Fn signal_initialized ,and.Fn signal_pendingare abbreviations.The event type will be a persistent.Va EV_SIGNAL .That means.Fn signal_setadds.Va EV_PERSIST ..PpIt is possible to disable support for.Va epoll , kqueue , devpoll, pollor.Va selectby setting the environment variable.Va EVENT_NOEPOLL , EVENT_NOKQUEUE , EVENT_NODEVPOLL, EVENT_NOPOLLor.Va EVENT_NOSELECT .By setting the environment variable.Va EVENT_SHOW_METHOD ,.Nm libeventdisplays the kernel notification method that it uses..Pp.Sh EVENT PRIORITIESBy default.Nm libeventschedules all active events with the same priority.However, sometime it is desirable to process some events with a higherpriority than others.For that reason,.Nm libeventsupports strict priority queues.Active events with a lower priority are always processed before eventswith a higher priority..PpThe number of different priorities can be set initially with the.Fn event_priority_initfunction.This function should be called before the first call to.Fn event_dispatch .The.Fn event_priority_setfunction can be used to assign a priority to an event.By default,.Nm libeventassigns the middle priority to all events unless their priorityis explicitly set..Pp.Sh THREAD SAFE EVENTS.Nm Libeventhas experimental support for thread-safe events.When initializing the library via.Fn event_init ,an event base is returned.This event base can be used in conjunction with calls to.Fn event_base_set.Fn event_base_dispatch ,.Fn event_base_loop ,and.Fn event_base_loopexit ..Fn event_base_set should be called after preparing an event with.Fn event_set , as.Fn event_set assigns the provided event to the most recently created event base..Pp.Sh BUFFERED EVENTS.Nm libeventprovides an abstraction on top of the regular event callbacks.This abstraction is called a.Va "buffered event" .A buffered event provides input and output buffer that get filledand drained automatically.The user of a buffered event no longer deals directly with the IO,but instead is reading from input and writing to output buffers..PpA new bufferevent is created by.Fn bufferevent_new .The parameter.Fa "fd"specifies the file descriptor from which data is read and written to.This file descriptor is not allowed to be a .Xr pipe 2 .The next three parameters are callbacks.The read and write callback have the following form.Ft void.Fn "(*cb)" "struct bufferevent *bufev" "void *arg"The argument is specified by the fourth parameter.Fa "cbarg" ..PpBy default the buffered event is read enabled and will try to readfrom the file descriptor.The write callback is executed whenever the output buffer is drainedbelow the write low watermark which is.Va 0by default..PpThe.Fn bufferevent_writefunction can be used to write data to the file descriptor.The data is appended to the output buffer and written to the descriptorautomatically as it becomes available for writing.The.Fn bufferevent_readfunction is used to read data from the input buffer.Both functions return the amount of data written or read..Pp.Sh RETURN VALUESUpon successful completion.Fn event_addand.Fn event_delreturn 0.Otherwise, -1 is returned and the global variable errno isset to indicate the error..Sh SEE ALSO.Xr timeout 9 ,.Xr select 2 ,.Xr kqueue 2.Sh HISTORYThe.Nm eventAPI manpage is based on the.Xr timeout 9manpage by Artur Grabowski.The port of.Nm libeventto Windows is due to Michael A. Davis.Support for real-time signals is due to Taral..Sh AUTHORSThe.Nm eventlibrary was written by Niels Provos..Pp.Sh BUGSThis documentation is neither complete nor authoritative.If you are in doubt about the usage of this API thencheck the source code to find out how it works, writeup the missing piece of documentation and send it tome for inclusion in this man page.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -