2015-11-21 2 views
0

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

Пример отпечатков, которые не будут показываться, пока после 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?

+0

Не знаете, почему это произойдет. Но вы можете попытаться явно сбросить stdout с помощью 'fflush (stdout);' после операторов печати. Или отключите буферизацию в целом с помощью 'setvbuf (stdout, NULL, _IONBF, 0)'. – kaylum

+0

Спасибо, я на самом деле использовал 'setbuf (stdout, NULL)' (короче, чем 'setvbuf'). 'fflush (stdout)' также работает. Но я чувствую, что эти решения являются обходными решениями, которые не затрагивают основную проблему epoll, блокирующую буфер stdout. Было бы неплохо узнать, можно ли это решить в самой эпосе. –

+0

epoll вряд ли может повлиять на вывод, который выполняется перед вызовами epoll. Является ли запись stdout непосредственно на устройство tty или перенаправляется на канал или файл? –

ответ

0

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

// Since there's 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, но с тем, как пользовательским пространством буферов стандартного вывода:

// Since there's 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); 

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

Смежные вопросы