tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kqueue - Specific change information.
On Fri, 28 Mar 2008, Adam Panayis wrote:
Hi, I would like to be notified of changes made within a folder but not have
to rescan the folder to get an updated listing everytime I am notified of a
change.
Is there a method using Kqueues by which I can monitor a folder and then,
when say, a file is added retrieve that specific info? i.e, "file x added in
folder y" as opposed to just getting "something happened in folder y"
Is this possible?
Try the code appended below. Run:
% mkdir /tmp/kev
% ./kev2 /tmp/kev /tmp/kev.log
Waiting for /tmp/kev to get touched...
--> (*** run "touch /tmp/kev/x" in other window ***)
Ran: ( date ; ls -l '/tmp/kev' ) >/tmp/kev.log
% cat /tmp/kev.log
Wed Feb 13 16:58:33 CET 2008
total 0
-rw-r--r-- 1 feyrer wheel 0 Feb 13 16:58 x
Fiddling with the arguments to find out what exactly happened is left as
an exercise to you.
If your question was on how to do that from within the kernel instead of
from userland -> I have no idea. :)
- Hubert
/* kev2.c */
#include <stdio.h>
#include <sys/event.h>
#include <sys/time.h>
#include <assert.h>
#include <fcntl.h>
#include <stdlib.h>
void usage(void)
{
printf("Usage: %s dir-to-monitor logfile\n",
getprogname());
exit (0);
}
int main(int argc, char *argv[])
{
char cmd[256];
int qd, fd;
struct kevent filter, result;
int n;
if (argc != 3)
usage();
sprintf(cmd, "( date ; ls -l '%s' ) >%s", argv[1], argv[2]);
qd = kqueue();
assert(qd > 0);
fd = open(argv[1], O_RDONLY);
assert(fd > 0);
EV_SET( &filter, fd, EVFILT_VNODE, EV_ADD,
NOTE_WRITE|NOTE_EXTEND|NOTE_LINK, 0, NULL);
printf("Waiting for %s to get touched...\n", argv[1]);
/* n = */ kevent(qd, &filter, 1, &result, 1, NULL);
/* assert(n > 0); *//* speed up! */
/* should check 'result' here... */
system(cmd);
printf("Ran: %s\n", cmd);
return 0;
}
Home |
Main Index |
Thread Index |
Old Index