При использовании 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
?
Не знаете, почему это произойдет. Но вы можете попытаться явно сбросить stdout с помощью 'fflush (stdout);' после операторов печати. Или отключите буферизацию в целом с помощью 'setvbuf (stdout, NULL, _IONBF, 0)'. – kaylum
Спасибо, я на самом деле использовал 'setbuf (stdout, NULL)' (короче, чем 'setvbuf'). 'fflush (stdout)' также работает. Но я чувствую, что эти решения являются обходными решениями, которые не затрагивают основную проблему epoll, блокирующую буфер stdout. Было бы неплохо узнать, можно ли это решить в самой эпосе. –
epoll вряд ли может повлиять на вывод, который выполняется перед вызовами epoll. Является ли запись stdout непосредственно на устройство tty или перенаправляется на канал или файл? –