2013-03-10 72 views
0

我有,例如,打印三行,交流程序開的兩個秒,那就是:重定向標準輸出到FIFO立即

printf("Wait 2 seconds...\n"); 
    sleep(2); 
    printf("Two more\n"); 
    sleep(2); 
    printf("Quitting in 2 seconds...\n"); 
    sleep(2); 

我執行該程序,並將其重定向到一個管:

./printer > myPipe 

在另一終端

cat < myPipe 

第二端子打印一次全部6秒後!我希望它立即打印可用的行。我該怎麼做?

Obs:我無法更改源代碼。這實際上是一個棋盤遊戲算法的輸出,我必須馬上得到它,以便我可以將它插入到另一個算法,獲得答案並插入第一個...

+0

使用'尾巴-f myPipe'而不是'cat 2013-03-10 08:49:17

+0

請參閱http://unix.stackexchange.com/questions/25372/turn-off-buffering-in -管。 – chepner 2013-03-10 13:43:23

回答

1

將程序更改爲此方法:

printf("Wait 2 seconds...\n"); 
    fflush (stdout); 
    sleep(2); 
    printf("Two more\n"); 
    fflush (stdout); 
    sleep(2); 
    printf("Quitting in 2 seconds...\n"); 
    fflush (stdout); 
    sleep(2); 

附加:

如果你不能改變的程序,實在是沒有辦法影響程序的內置緩存沒有黑客它。

如果您可以重新鏈接程序,您可以用printf()函數替代每次調用後刷新的函數。或者將標準輸出的啓動初始化更改爲無緩衝—或至少行緩衝。

+0

\ n應該fflush stdout,對吧? – anishsane 2013-03-10 06:34:31

+1

@anishsane,不,那是我的問題。只有stdout存在於終端上時纔會這樣。在我的情況下,它已被重定向到一個管道,它沒有。 – 2013-03-10 08:59:31

1

如果你不能改變源代碼,你可能會想嘗試一些解決方案,此相關的問題: bash: force exec'd process to have unbuffered stdout

基本上,你必須做出操作系統交互執行該程序。

+0

哦,那些答案其實很有用,謝謝! – 2013-03-10 09:03:02

1

我假設實際的源文件是完整的。如果是這樣,那麼你必須編譯源代碼並運行它來讓它做任何事情。使用cat只會打印文件內容,而不是運行它。

如果它是在bash中編寫的,那麼它必須設置爲模式位+ x,然後使其可執行。允許您從一個終端運行./script

無需擔心語法,因爲你說這不是一個選項來改變它,...它正確地寫在C.

相關問題