Messages in this thread | | | From | Heiher <> | Date | Sun, 18 Aug 2019 00:36:46 +0800 | Subject | Why the edge-triggered mode doesn't work for epoll file descriptor? |
| |
Hello,
I've added a pipe file descriptor (fd1) to an epoll (fd3) with EPOLLOUT in edge-triggered mode, and then added the fd3 to another epoll (fd4) with EPOLLIN in edge-triggered too.
Next, waiting for fd4 without timeout. When fd1 to be writable, i think epoll_wait(fd4, ...) only return once, because all file descriptors are added in edge-triggered mode.
But, the actual result is returns many and many times until do once eopll_wait(fd3, ...).
#include <stdio.h> #include <unistd.h> #include <sys/epoll.h>
int main (int argc, char *argv[]) { int efd[2]; struct epoll_event e;
efd[0] = epoll_create (1); if (efd[0] < 0) return -1;
efd[1] = epoll_create (1); if (efd[1] < 0) return -2;
e.events = EPOLLIN | EPOLLET; e.data.u64 = 1; if (epoll_ctl (efd[0], EPOLL_CTL_ADD, efd[1], &e) < 0) return -3;
e.events = EPOLLOUT | EPOLLET; e.data.u64 = 2; if (epoll_ctl (efd[1], EPOLL_CTL_ADD, 1, &e) < 0) return -4;
for (;;) { struct epoll_event events[16]; int nfds;
nfds = epoll_wait (efd[0], events, 16, -1); printf ("nfds: %d\n", nfds); }
close (efd[1]); close (efd[0]);
return 0; }
-- Best regards! Hev https://hev.cc
| |