EPOLL(7) Linux Programmer's Manual EPOLL(7) epoll - I/O #include epoll API poll(2) I/O epoll API edge-triggeredlevel-triggered epoll API epoll epoll instance o interest list epoll epoll set"" o ready list"" I/O I/O epoll o epoll_create(2) epoll epoll_create1(2) epoll_create(2) o epoll_ctl(2) epoll o epoll_wait(2) I/O epoll epoll ETLT 1. epoll rfd 2. 2 kB 3. epoll_wait(2) rfd 4. rfd 1 kB 5. epoll_wait(2) rfd epoll EPOLLET 1 KB 5epoll_wait(2) 52 rfd 345epoll_wait(2) EPOLLET epollEPOLLET a) b) read(2) write(2) EAGAIN EPOLLET epoll poll(2) poll(2) epoll EPOLLONESHOT epoll epoll_wait(2) EPOLLONESHOT epoll_ctl(2) EPOLL_CTL_MOD rearm epoll fork(2) epoll epoll epoll_wait(2) (EPOLLET) epoll_wait(2) ""thundering herd /sys/power/autosleep autosleep epoll_ctl(2) EPOLLWAKEUP struct epoll_event events EPOLLWAKEUP epoll_wait(2) epoll_wait(2) epoll_wait(2) wake_lock /proc epoll /proc/sys/fs/epoll/max_user_watches Linux 2.6.28 epoll ID329064160 max_user_watches 1/254% epoll epoll poll(2) listen(2) listener do_use_fd() read(2) write(2) EAGAIN EAGAIN do_use_fd() read(2) write(2) #define MAX_EVENTS 10 struct epoll_event ev, events[MAX_EVENTS]; int listen_sock, conn_sock, nfds, epollfd; /* Code to set up listening socket, 'listen_sock', (socket(), bind(), listen()) omitted. */ epollfd = epoll_create1(0); if (epollfd == -1) { perror("epoll_create1"); exit(EXIT_FAILURE); } ev.events = EPOLLIN; ev.data.fd = listen_sock; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) { perror("epoll_ctl: listen_sock"); exit(EXIT_FAILURE); } for (;;) { nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1); if (nfds == -1) { perror("epoll_wait"); exit(EXIT_FAILURE); } for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listen_sock) { conn_sock = accept(listen_sock, (struct sockaddr *) &addr, &addrlen); if (conn_sock == -1) { perror("accept"); exit(EXIT_FAILURE); } setnonblocking(conn_sock); ev.events = EPOLLIN | EPOLLET; ev.data.fd = conn_sock; if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev) == -1) { perror("epoll_ctl: conn_sock"); exit(EXIT_FAILURE); } } else { do_use_fd(events[n].data.fd); } } } EPOLL_CTL_ADD (EPOLLIN|EPOLLOUT) epoll_ctl(2) EPOLL_CTL_MOD EPOLLIN EPOLLOUT epoll 0. open file description"open file handle" 1. epoll EEXISTepolldup(2),dup2(2), fcntl(2) F_DUPFDevents mask 2. epoll epoll 3. epoll poll/epoll/selectable epoll 4. epoll epoll_ctl(2) EINVAL epoll epoll 5. UNIX epoll 6. epoll open file description open(2) dup(2), dup2(2), fcntl(2) F_DUPFD, fork(2) epoll_ctl(2) EPOLL_CTL_DEL dup(2) fork(2) , 7. epoll_wait(2) 8. I/O 9. EPOLLET /EAGAIN epoll_wait(2) I/O / EAGAIN /canonical mode,/ I/O / EAGAIN FIFO// I/O read(2) read(2) I/O write(2) o I/O ( epoll o ... epoll_wait(2) epoll_wait(2) 100#47#13close(2)#13#13 47 epoll_ctl(EPOLL_CTL_DEL)close(2)131313 epoll API Linux 2.5.442.3.2 glibc epoll API Linux FreeBSD kqueue Solaris /dev/poll /proc/[pid]/fdinfo epoll epoll proc(5) kcmp(2) KCMP_EPOLL_TFD epoll epoll_create(2), epoll_create1(2), epoll_ctl(2), epoll_wait(2), poll(2), select(2) man man https://github.com/man-pages-zh/manpages- zh Linux 2021-03-22 EPOLL(7)