2016-10-01 85 views
1

睡眠1秒後我有一個printf語句。由於printf語句花費的時間超過1秒,因此刷新率大於2秒。這裏是我正在談論的一個例子:是否有可能在linux終端中以非阻塞方式實現printf()

while(1){ 
    printf("%s",buf);//Takes more than one second to print a table. Only few   
        //values are updated 
    sleep(1); 
} 

我怎樣纔能有一個printf是非阻塞的。在標準的linux機器上有沒有辦法?

-Sanatan

+1

'printf(...);沖洗(buf);'? (多年沒有這樣做,但尋找正確使用'flush()'。(或'fflush()'?)祝你好運 – shellter

+0

@shellter如何做一個單獨的fflush()解決他的問題?它wouldn不會更快,並且仍然會阻止 – jforberg

+0

@jforberg:正如我所說的,「這些年來沒有這樣做過,」而這不是iI所描述的完美書面問題,所以我只是提供了一些嘗試,直到出現了一位專家的回答(有時候他們沒有出現),其他人似乎同意這是值得一試的,如果能解決OP問題,我會很樂意回答下面的問題,祝大家好運 – shellter

回答

2

如果您只關心屏幕上顯示的內容,那就是curses解決的問題之一。使用curses,您可以使用合理的最佳輸出來更新顯示(只更改已更改的區域而不是每次打印整個表格),並且使用功能可以減輕更新速度過快時出現的問題。

它比printf更復雜。但與printf,緩衝區將滿,並且除了標準輸出外無處可以。在一些實現中,你可以使用setvbuf分配一個新的輸出緩衝區,但對POSIX皺眉輸出後開始,saying

後的數據流指向流相關的setvbuf()功能可以使用打開文件,但之前在流上執行任何其他操作(除了不成功調用setvbuf())。

因此,ncurses已經對待setvbuf(以及類似的功能,如setbuf)謹慎處理。在當前版本中,爲了解決其他問題,ncurses不再使用這個函數。但它是still documented

ncurses啓用終端初始化期間的緩衝輸出。這是由於性能原因(如SVr4詛咒)完成的。出於測試目的,ncurses和某些應用程序,此功能是可選的。 設置NCURSES_NO_SETBUF變量禁用輸出 緩衝,使輸出保持原來的狀態(通常爲 行緩衝)模式。

+0

我剛剛發佈了關於ncurses的答案,這裏是維護者自己打我:)它是一個小型互聯網。 – jforberg

+0

感謝您的建議。它與使用另一個專用於執行printf操作的線程相比如何? – sanatan

+0

printf可能會落後並且其緩衝區已滿:-) –

0

函數printf是緩衝功能。當緩衝區已滿或強制它時,它只會刷新到標準輸出。如果您打印一個\ n這將填滿緩衝區。你可以做的是在標準輸出上使用fflush函數來強制它。

+0

我不明白這與問題有什麼關係,雖然不清楚,但這個問題並沒有提到緩衝,這似乎並不是他的問題。 – jforberg

相關問題