#include #include #include #include #include #include #include #include #include int efd[1024]; int fd_count = 250; int write_sleep = 250; void write_thread () { int index; uint64_t count = 0; srand (time (NULL)); while (1) { index = rand () % fd_count; if (efd[index] != 0) { write (efd[index], &count, sizeof (uint64_t)); } ++count; usleep (write_sleep); } } int main (int argc, char **argv) { fd_set fds; struct timeval timeout = { 0, 0 }; int max_fd = 0; int sleep_time = 90; int count = 0; pthread_t pid; int i = 0; if (argc > 1) { for (i = 0; i < argc; ++i) { if (strcmp (argv[i], "-f") == 0) { fd_count = atoi (argv[i + 1]); if (fd_count > 1024) fd_count = 1024; ++i; } else if (strcmp (argv[i], "-s") == 0) { sleep_time = atoi (argv[i + 1]); ++i; } else if (strcmp (argv[i], "-w") == 0) { write_sleep = atoi (argv[i + 1]); ++i; } } } for (i = 0; i < fd_count; ++i) { efd[i] = eventfd (0, EFD_NONBLOCK); if (efd[i] == 0) { printf ("create %dth fd failed,errno:%d\n", i, errno); return 0; } } pthread_create (&pid, NULL, (void*)write_thread, NULL); while (1) { FD_ZERO (&fds); for (i = 0; i < fd_count; ++i) { if (efd[i] != 0) FD_SET (efd[i], &fds); if (efd[i] > max_fd) max_fd = efd[i]; } int ret = 0; timeout.tv_sec = 0; timeout.tv_usec = sleep_time; ret = select (max_fd, &fds, NULL, NULL, NULL); //usleep(sleep_time); uint64_t nosense; count = 0; for (i = 0; i < fd_count; ++i) { if (FD_ISSET (efd[i], &fds)) { read (efd[i], &nosense, sizeof (uint64_t)); ++count; } if (count >= ret) { break; } } } for (i = 0; i < fd_count; ++i) close (efd[i]); return 0; }