watching for a directory with kqueue

John Baldwin jhb at freebsd.org
Tue Mar 6 15:39:57 UTC 2012


On Monday, March 05, 2012 1:12:55 pm Sergey Matveychuk wrote:
> Hi.
> 
> I've met a problem with the subj. Could you help?
> 
> I'm watching for a directory:
>      EV_SET(kq_change_list, fd, EVFILT_VNODE,
>              EV_ADD | EV_ENABLE | EV_ONESHOT,
>              NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB,
>              0, 0);
> 
> When the directory changed, I read its contens with opendir, like that:
> struct kq_event kq_event[1000];
> ...
> while(1) {
>          n = kevent(kq, kq_change_list, chlist_used, kq_event, 1000, NULL);
> 	for(i = 0; i < n; i++) {
> 		if(kq_event[i].fflags & NOTE_EXTEND || kq_event[i].fflags & 
NOTE_WRITE) {
> 			opendir(.....)
> 
> It works when I create a few files (1-3), but when I create 10 files 
> with touch(1) I see only 3-6 files with opendir. I've got only one event 
> with kevent() (n=1). Looks like I should got a few events, but I did 
> not. Could you give an advice how to get all created files?

The problem is your kevent can fire after just one file is created, so you
can run opendir() before all 10 files are created.  If you want the keven to 
keep firing, you need to not use EV_ONESHOT.  Instead, you probably want to
use EV_CLEAR.  That would let you get multiple events for the directory, and 
by the last one, all 10 files should be present.

-- 
John Baldwin


More information about the freebsd-hackers mailing list