LINUX.ORG.RU

FreeBSD: Неблокирующий kevent()


0

1
  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() процесс останавливается, и начинает ждать событий.
Как сделать, что он не ждал (неблокирующее чтение)?

★★★★★

man kevent

To effect a poll, the timeout argument should be non-NULL, pointing to a zero-valued timespec structure.

yoghurt ★★★★★
()
Ответ на: комментарий от Reset

Я по диагонали прочитал, думал проблема в том что io блокирующее.

Впрочем, это не отменяет вопроса. Я действительно не понимаю людей которые не используют эти либы потому что даже попытка засунуть внутрь поддержку и kqeue и epoll(для кросс-платформенности) ведёт либо к страшным костылям(самый вероятный вариант) либо к изобретению libevent заново.

true_admin ★★★★★
()
Ответ на: комментарий от tailgunner

И таймаута в этом вашем kevent нет? O_o

не знаю есть или нет, но SIGALARM прикрутить можно точно :)

true_admin ★★★★★
()
Ответ на: комментарий от Reset

Кстати, там есть таймаут. Ну и иногда имеет смысл просто проверить наличие событий без блокировки.

true_admin ★★★★★
()
Ответ на: комментарий от Reset

libevent не поддерживает слежение за файлами

через inotify/fanotify можно сделать дескриптор который потом передать в libevent для мониторинга.

true_admin ★★★★★
()
Ответ на: комментарий от Reset

timeout это последний аргумент :)

чорт, секунда в секунду, но ты первый :)

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

inotify нет во freebsd, там вместо этого kevent :) c kevent точно такое не провернешь, так как нет способа передать в libevent fflag'и NOTE_WRITE | NOTE_DELETE | NOTE_ATTRIB

Reset ★★★★★
()
Ответ на: комментарий от Reset

Ага, и ещё с kevent-ом надо открывать файловый дескриптор на каждый отслеживаемый файл - полный отстой!

yoghurt ★★★★★
()
Ответ на: комментарий от tailgunner

Да есть там всё, просто маны народ читать не хочет

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Это можно считать как достоинством так и недостатком.

Reset ★★★★★
()

Тред звездатых, однако

yoghurt ★★★★★
()
Ответ на: комментарий от Reset

> ага, timeout это последний аргумент :)

Да, про него я забыл.

Сейчас все работает нормально.

Единственное - остался баг с pthread_cancel(), система под FreeBSD не выходит на cancellation point.
http://www.linux.org.ru/forum/development/6306008?lastmod=1306353938592

pacify ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.