Код ревью
struct data_t {
int fd;
size_t count;
bool done;
};
void process_pair_ready_read(data_t *data) {
char buffer[4096];
ssize_t cnt = read(data->fd, buffer, sizeof(buffer));
if (cnt > 0) {
data->count += cnt;
}
else if (cnt == 0) {
data->done = true;
}
}
void process_epoll_event(epoll_event * event, size_t& files_left) {
const uint32_t mask = event->events;
data_t * data = event->data.ptr;
if (mask & EPOLLIN) {
process_pair_ready_read(data);
}
if (data->done) {
files_left--;
}
}
size_t read_data_and_count(size_t N, int fds[N]) {
data_t ** entries = calloc(N, sizeof(*entries));
int epoll_fd = epoll_create1(0);
for (size_t i = 0; i < N; ++i) {
entries[i] = create_event_data(epoll_fd, fds[i]);
}
size_t files_left = N;
epoll_event pending[N];
while(files_left > 0) {
int n = epoll_wait(epoll_fd, pending, N, -1);
for (int i = 0; i < n; ++i) {
process_epoll_event(&pending[i], files_left);
}
}
size_t result = 0;
for (int i = 0; i < N; i++) {
result += entries[i]->count;
}
}