From 4422091b9b8967efdcfea8f650321595a8d95a98 Mon Sep 17 00:00:00 2001
From: root ev_periodic
- to cron or not to cron?ev_signal
- signal me when a signal gets signalled!ev_child
- watch out for process status changesev_stat
- did the file attributes just change?ev_idle
- when you've got nothing better to do...ev_prepare
and ev_check
- customise your event loop!ev_embed
- when one backend isn't enough...
The pid specified in the ev_child
watcher has received a status change.
EV_STAT
The path specified in the ev_stat
watcher changed its attributes somehow.
EV_IDLE
The ev_idle
watcher has determined that you have nothing better to do.
This section describes each watcher in detail, but will not repeat -information given in the last section.
+information given in the last section. Any initialisation/set macros, +functions and members specific to the watcher type are explained. +Members are additionally marked with either [read-only], meaning that, +while the watcher is active, you can look at the member and expect some +sensible content, but you must not modify it (you can modify it while the +watcher is stopped to your hearts content), or [read-write], which +means you can expect it to have some sensible content while the watcher +is active, but you can also modify it. Modifying it may not do something +sensible or take immediate effect (or do anything at all), but libev will +not crash or malfunction in any way.
@@ -783,6 +797,14 @@ its own, so its quite safe to use). rceeive events for and events is eitherEV_READ
, EV_WRITE
or
EV_READ | EV_WRITE
to receive the given events.
+ The file descriptor being watched.
+The events being watched.
+Example: call stdin_readable_cb
when STDIN_FILENO has become, well
readable, but only once. Since it is likely line-buffered, you could
@@ -849,13 +871,34 @@ repeating. The exact semantics are:
If the timer is repeating, either start it if necessary (with the repeat value), or reset the running timer to the repeat value.
This sounds a bit complicated, but here is a useful and typical
-example: Imagine you have a tcp connection and you want a so-called idle
-timeout, that is, you want to be called when there have been, say, 60
-seconds of inactivity on the socket. The easiest way to do this is to
-configure an ev_timer
with after=repeat=60 and calling ev_timer_again each
-time you successfully read or write some data. If you go into an idle
-state where you do not expect data to travel on the socket, you can stop
-the timer, and again will automatically restart it if need be.
ev_timer
with after
=repeat
=60
and calling
+ev_timer_again
each time you successfully read or write some data. If
+you go into an idle state where you do not expect data to travel on the
+socket, you can stop the timer, and again will automatically restart it if
+need be.
+ You can also ignore the after
value and ev_timer_start
altogether
+and only ever use the repeat
value:
ev_timer_init (timer, callback, 0., 5.); + ev_timer_again (loop, timer); + ... + timer->again = 17.; + ev_timer_again (loop, timer); + ... + timer->again = 10.; + ev_timer_again (loop, timer); + ++
This is more efficient then stopping/starting the timer eahc time you want +to modify its timeout value.
+ +The current repeat
value. Will be used each time the watcher times out
+or ev_timer_again
is called and determines the next timeout (if any),
+which is also when any modifications are taken into account.
Example: create a timer that fires after 60 seconds.
@@ -983,6 +1026,18 @@ when you changed some parameters or the reschedule callback would return a different time than the last time it was called (e.g. in a crond like program when the crontabs have changed). +The current interval value. Can be modified any time, but changes only
+take effect when the periodic timer fires or ev_periodic_again
is being
+called.
The current reschedule callback, or 0
, if this functionality is
+switched off. Can be changed any time, but changes only take effect when
+the periodic timer fires or ev_periodic_again
is being called.
Example: call a callback every hour, or, more precisely, whenever the system clock is divisible by 3600. The callback invocation times have @@ -1041,6 +1096,10 @@ SIG_DFL (regardless of what it was set to before).
Configures the watcher to trigger on the given signal number (usually one
of the SIGxxx
constants).
The signal the watcher watches out for.
+sys/wait.h
and see your system
waitpid
documentation). The rpid
member contains the pid of the
process causing the status change.
+ The process id this watcher watches out for, or 0
, meaning any process id.
The process id that detected a status change.
+The process exit/trace status caused by rpid
(see your systems
+waitpid
and sys/wait.h
documentation for details).
Example: try to exit cleanly on SIGINT and SIGTERM.
static void @@ -1078,6 +1150,99 @@ process causing the status change. ++ +
ev_stat
- did the file attributes just change?This watches a filesystem path for attribute changes. That is, it calls
+stat
regularly (or when the OS says it changed) and sees if it changed
+compared to the last time, invoking the callback if it did.
The path does not need to exist: changing from "path exists" to "path does
+not exist" is a status change like any other. The condition "path does
+not exist" is signified by the st_nlink
field being zero (which is
+otherwise always forced to be at least one) and all the other fields of
+the stat buffer having unspecified contents.
Since there is no standard to do this, the portable implementation simply
+calls stat (2)
regulalry on the path to see if it changed somehow. You
+can specify a recommended polling interval for this case. If you specify
+a polling interval of 0
(highly recommended!) then a suitable,
+unspecified default value will be used (which you can expect to be around
+five seconds, although this might change dynamically). Libev will also
+impose a minimum interval which is currently around 0.1
, but thats
+usually overkill.
This watcher type is not meant for massive numbers of stat watchers, +as even with OS-supported change notifications, this can be +resource-intensive.
+At the time of this writing, no specific OS backends are implemented, but +if demand increases, at least a kqueue and inotify backend will be added.
+Configures the watcher to wait for status changes of the given
+path
. The interval
is a hint on how quickly a change is expected to
+be detected and should normally be specified as 0
to let libev choose
+a suitable value. The memory pointed to by path
must point to the same
+path for as long as the watcher is active.
The callback will be receive EV_STAT
when a change was detected,
+relative to the attributes at the time the watcher was started (or the
+last change was detected).
Updates the stat buffer immediately with new values. If you change the +watched path in your callback, you could call this fucntion to avoid +detecting this change (while introducing a race condition). Can also be +useful simply to find out the new values.
+The most-recently detected attributes of the file. Although the type is of
+ev_statdata
, this is usually the (or one of the) struct stat
types
+suitable for your system. If the st_nlink
member is 0
, then there
+was some error while stat
ing the file.
The previous attributes of the file. The callback gets invoked whenever
+prev
!= attr
.
The specified interval.
+The filesystem path that is being watched.
+Example: Watch /etc/passwd
for attribute changes.
static void + passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) + { + /* /etc/passwd changed in some way */ + if (w->attr.st_nlink) + { + printf ("passwd current size %ld\n", (long)w->attr.st_size); + printf ("passwd current atime %ld\n", (long)w->attr.st_mtime); + printf ("passwd current mtime %ld\n", (long)w->attr.st_mtime); + } + else + /* you shalt not abuse printf for puts */ + puts ("wow, /etc/passwd is not there, expect problems. " + "if this is windows, they already arrived\n"); + } + + ... + ev_stat passwd; + + ev_stat_init (&passwd, passwd_cb, "/etc/passwd"); + ev_stat_start (loop, &passwd); + + + +
ev_loop (embedded_loop, EVLOOP_NONBLOCK)
, but in the most
apropriate way for embedded loops.
The embedded event loop.
+If undefined or defined to be 1
, then periodic timers are supported. If
+defined to be 0
, then they are not. Disabling them saves a few kB of
+code.
If undefined or defined to be 1
, then embed watchers are supported. If
+defined to be 0
, then they are not.
If undefined or defined to be 1
, then stat watchers are supported. If
+defined to be 0
, then they are not.
If undefined or defined to be 1
, then periodic timers are supported,
-otherwise not. This saves a few kb of code.
If you need to shave off some kilobytes of code at the expense of some
+speed, define this symbol to 1
. Currently only used for gcc to override
+some inlining decisions, saves roughly 30% codesize of amd64.