epoll.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <sys/epoll.h>
  6. #include <fcntl.h>
  7. #include <errno.h>
  8. #define TEST_TIMES 4
  9. int main (int argc, char ** argv)
  10. {
  11. int ret = 0;
  12. int fds[TEST_TIMES][2];
  13. int efd = epoll_create(TEST_TIMES);
  14. if (efd < 0) {
  15. perror("epoll_create");
  16. exit(1);
  17. }
  18. struct epoll_event event;
  19. for (int i = 0 ; i < TEST_TIMES ; i++) {
  20. ret = pipe(fds[i]);
  21. if (ret < 0) {
  22. perror("pipe");
  23. exit(1);
  24. }
  25. event.events = EPOLLIN;
  26. event.data.fd = fds[i][0];
  27. ret = epoll_ctl(efd, EPOLL_CTL_ADD, fds[i][0], &event);
  28. if (ret < 0) {
  29. perror("epoll_ctl add");
  30. exit(1);
  31. }
  32. }
  33. ret = fork();
  34. if (ret < 0) {
  35. perror("fork");
  36. exit(1);
  37. }
  38. if (!ret) {
  39. for (int i = 0 ; i < TEST_TIMES ; i++) {
  40. close(fds[i][0]);
  41. char c = 0;
  42. write(fds[i][1], &c, 1);
  43. close(fds[i][1]);
  44. }
  45. exit(0);
  46. }
  47. for (int i = 0 ; i < TEST_TIMES ; i++)
  48. close(fds[i][1]);
  49. for (int i = 0 ; i < TEST_TIMES ; i++) {
  50. ret = epoll_wait(efd, &event, 1, -1);
  51. if (ret < 0) {
  52. perror("epoll_wait");
  53. exit(1);
  54. }
  55. if (!ret)
  56. break;
  57. if (event.events & EPOLLIN) {
  58. char c;
  59. read(event.data.fd, &c, 1);
  60. }
  61. printf("fd %d polled:", event.data.fd);
  62. if (event.events & EPOLLIN)
  63. printf(" EPOLLIN");
  64. if (event.events & EPOLLERR)
  65. printf(" EPOLLERR");
  66. if (event.events & EPOLLHUP)
  67. printf(" EPOLLHUP");
  68. if (event.events & EPOLLRDHUP)
  69. printf(" EPOLLRDHUP");
  70. printf("\n");
  71. }
  72. return 0;
  73. }