int kq;
kq = kqueue();
if(kq == -1) {
printf("Cannot create kqueue descriptor.\n");
exit(EXIT_FAILURE);
}
struct kevent ke;
bzero(&ke,sizeof(ke));
int fd = open(message.filename, O_RDONLY);
int flags = fcntl(fd, F_GETFL, 0);
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
perror("fcntl()");
}
EV_SET(&ke,fd,EVFILT_VNODE,EV_ADD|EV_CLEAR,NOTE_WRITE | NOTE_DELETE | NOTE_ATTRIB,0,NULL);
int r = kevent(kq,&ke,1,NULL,0,NULL);
if(r == -1) {
printf("Cannot set event handler.\n");
perror("kevent()");
exit(EXIT_FAILURE);
}
...
while (TRUE) {
#ifdef __FreeBSD__
// FreeBSD
if(kevent(kq,NULL,0,&ke,1,NULL) != -1) {
printf("EVENT: %d\n", ke.fflags);
...
На kevent() процесс останавливается, и начинает ждать событий.
Как сделать, что он не ждал (неблокирующее чтение)?