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 _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"