epoll_wait() блокирует отпечатки на stdout

93
15

При использовании epoll_wait, кажется, "съедает" все, что написано в stdout и откладывает печать до тех пор, пока epoll_wait не получит событие, даже несмотря на то, что я пытался распечатать, прежде чем называть что-либо, связанное с epoll (это может быть даже в начале моего главный метод, он все равно не будет напечатан).

Пример отпечатков, которые не будут отображаться до тех пор, пока epoll_wait не получит событие:

printf("This doesn't get printed. ");
fprintf(stdout, "This doesn't get printed either.");
ev.events = EPOLLIN;
ev.data.fd = some_sock_fd; // Same with STDIN_FILENO
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, some_sock_fd, &ev) == -1) {
perror("epoll_ctl");
exit(EXIT_FAILURE);
}

for (;;) {
rc = epoll_wait(epoll_fd, &ev, 1, -1);
// This is where it gets printed

Запись в stderr работает нормально, но как я могу писать в stdout? Как предотвратить блокировку печати epoll_wait в stdout?

спросил(а) 2015-11-21T22:22:00+03:00 4 года, 11 месяцев назад
1
Решение
106

Проблема, похоже, не связана с epoll_wait. Вот краткое описание нарушившего кода:

// Since there no newline, the following stays in the buffer
printf("Some print without newline.");

for (;;) {
// At this point, the buffer has not been flushed,
// and epoll_wait blocks the output
rc = epoll_wait(epoll_fd, &ev, 1, -1);

Использование fflush(stdout) - это решение для этого кода, поскольку буферизация не имеет ничего общего с epoll_wait, но с тем, как буферизирует пользовательское пространство stdout:

// Since there no newline, the following stays in the buffer
printf("Some print without newline.");

// Forces a write of user-space buffered data for stdout
fflush(stdout);

for (;;) {
// At this point, the buffer has not been flushed,
// and epoll_wait blocks the output
rc = epoll_wait(epoll_fd, &ev, 1, -1);

Подводя итог, это, по-видимому, случай не в том месте, где проблема должна была быть очевидной.

ответил(а) 2015-11-22T15:08:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема