C   29

pitfall1.c

Guest on 5th May 2022 10:59:48 PM

  1. #include <assert.h>
  2. #include <errno.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <sys/epoll.h>
  8. #include <unistd.h>
  9.  
  10. static void print_event (struct epoll_event ev) {
  11.         char flags_str[200];
  12.  
  13.         flags_str[0] = 0;
  14.         flags_str[1] = 0; /* dirty */
  15.  
  16.         if (ev.events & EPOLLIN )       strcat(flags_str, "|EPOLLIN");
  17.         if (ev.events & EPOLLOUT)       strcat(flags_str, "|EPOLLOUT");
  18.         if (ev.events & EPOLLERR)       strcat(flags_str, "|EPOLLERR");
  19.         if (ev.events & EPOLLHUP)       strcat(flags_str, "|EPOLLHUP");
  20.         if (ev.events & EPOLLRDHUP)     strcat(flags_str, "|EPOLLRDHUP");
  21.         if (ev.events & EPOLLPRI)       strcat(flags_str, "|EPOLLPRI");
  22.         if (ev.events & EPOLLET)        strcat(flags_str, "|EPOLLET");
  23.         if (ev.events & EPOLLONESHOT)   strcat(flags_str, "|EPOLLONESHOT");
  24.  
  25.         fprintf(stderr, "Event for fd %i. Flags=(%s).\n",
  26.                         ev.data.fd, flags_str+1);
  27. }
  28.  
  29. int main() {
  30.         int epfd;
  31.         struct epoll_event ev;
  32.         struct epoll_event ret;
  33.         char buf[200];
  34.         int n, t;
  35.  
  36.         epfd = epoll_create(1);
  37.  
  38.         ev.data.fd = 0;
  39.         ev.events = EPOLLIN;
  40.  
  41.         if (epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &ev) != 0)
  42.                 perror("epoll_ctl");
  43.  
  44.         while ((n = epoll_wait(epfd, &ret, 1, -1)) > 0) {
  45.                 printf("tick!\n");
  46.                 print_event(ret);
  47.  
  48.                 if(ret.data.fd == 0) {
  49.                         t = read(0, buf, 100);
  50.  
  51.                         if (t == 0) {
  52.                                 close(0);
  53.                                 printf("stdin done\n");
  54.                         }
  55.                 }
  56.         }
  57.  
  58.         return 0;
  59. }

Raw Paste


Login or Register to edit or fork this paste. It's free.