Вызовы направляются к драйверу, когда приложение использует poll(), а не epoll() в Linux.

Вызовы приложений перенаправляются на метод опроса драйверов при использовании poll(), а не epoll(). Может у кого-нибудь есть идея, почему это происходит? ниже мой код приложения с epoll. И еще одно наблюдение: epoll_ctl() вызов направляется водителю, но не epoll_wait().

struct epoll_event ev, events[MAX_EPOLL_EVENTS];
int epfd, nfds;
epfd = epoll_create(MAX_EPOLL_EVENTS);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = fd; /* fd is an open file descriptor */
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) == -1) {
    printf("epoll_ctl failed\n");
}

nfds = epoll_wait(epfd, &events, MAX_EPOLL_EVENTS, 10000);

person Chinna    schedule 13.08.2015    source источник
comment
Разве это не так должно работать?   -  person Karoly Horvath    schedule 13.08.2015
comment
@KarolyHorvath Я не уверен, как это должно работать. Можете немного объяснить, если знаете   -  person Chinna    schedule 13.08.2015
comment
Есть ли разница, если вы не используете EPOLLET? EPOLLET сильно отличается от поведения poll().   -  person nos    schedule 13.08.2015


Ответы (1)


Реализация опроса и epoll отличается.

Прежде всего, мы знаем, что poll водителя всегда вызывает poll_wait(). Это самое важное различие для этих двух системных вызовов.

опрос/выбор

poll драйвера вызывается каждый раз, когда опрос/выбор вызывается из пользовательского пространства. Он добавляет текущий процесс в очередь ожидания и добавляет очередь ожидания в poll_table.

  1. Пользовательское пространство опросило 2 разных файловых дескриптора
  2. ядро вызвало драйвер poll каждого файлового дескриптора.
  3. Водители poll вызвали poll_wait. Он добавил текущий процесс в poll_table
  4. Предположим, что они тоже не были готовы. Итак, в poll table было 2 очереди ожидания.
  5. Когда 1 из дескриптора файла был готов, он разбудил процесс.
  6. Затем пробужденный процесс снова вызывает драйвер poll каждого файлового дескриптора, чтобы проверить, какой файловый дескриптор готов.
  7. Наконец, он вернулся в пользовательское пространство.

эполл

poll драйвера вызывается только epoll_ctl.

  1. Пользовательское пространство под названием epoll_ctl для установки двух разных файловых дескрипторов.
  2. ядро вызвало драйвер poll каждого файлового дескриптора.
  3. Водители poll вызвали poll_wait. Но на этот раз poll_wait отличается от опроса/выбора. Он не только добавил текущий процесс в poll_table, но и изменил функцию обратного вызова на ep_poll_callback, когда процесс был разбужен.
  4. Предположим, что они тоже не были готовы. Итак, теперь в poll table было 2 очереди ожидания.
  5. Когда 1 из дескриптора файла был готов, он разбудил процесс.
  6. Итак, ep_poll_callback называется. Он добавляет соответствующий файловый дескриптор в очередь готовности epoll.
  7. epoll_wait периодически проверял готовую очередь и находил готовую.
  8. Наконец, он вернулся в пользовательское пространство.
person Arthur    schedule 13.08.2015