2015-11-21 120 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

不知道爲什麼會發生。但是你可以嘗試在打印語句後用'fflush(stdout);'顯式地清除stdout。或者用'setvbuf(stdout,NULL,_IONBF,0)'完全關閉緩衝。 – kaylum

+0

謝謝,我實際上使用'setbuf(stdout,NULL)'(比'setvbuf'短)。 'fflush(stdout)'也適用。但我覺得這些解決方案是解決不了epoll阻塞stdout緩衝區的核心問題的解決方法。很高興知道這是否可以在epoll本身內解決。 –

+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); 

總結起來,這似乎是一個在錯誤的地方尋找一個本應該很明顯的問題的例子。

相關問題