2011-06-30 69 views
6

Linux/C /管道:Linux管道:通過popen捕獲ping的實時輸出

如何使用popen(或類似系統調用)捕獲ping命令的輸出。 目前popen將等到ping完成。然後輸出將一起傾倒。

僞代碼:

fp= popen("ping x.x.x.x", "r"); 
while(!feof(pFp)) 
{ 
    if(fgets(fp ...) // <==currently the code blocks here until ping finishes in popen 
    { 
     printf(...real time ping output here); 
    } 
} 
+0

C或C++?您的代碼看起來像C. – ThiefMaster

+0

您可能正在遭受緩衝。使用管道(2)進行更多控制。 – cdarke

+1

@cdarke:不會幫助。問題是ping是緩衝它的輸出。我肯定會認爲這是一個在ping中的錯誤。如果它知道它不會有多達一秒的輸出(當它睡覺時),那麼它應該在睡眠之前刷新其輸出... –

回答

7

這不是等到平結束。相反,在寫任何東西之前,ping都在等待,直到stdout緩衝區填滿。避免這種情況的唯一方法涉及僞ttys。要麼你應該放棄popen並編寫代碼來自己運行ping子進程,並使用僞tty進行通信(這很容易使用非標準的但廣泛可用的forkpty函數),或者你可以編寫一個包裝程序來運行ping通過僞-pty並抓取輸出,並將其寫入而不緩衝stdout

+0

謝謝,我也試過setvbuf(fp,NULL,_IONBF,0))。我期望,因爲緩衝被禁用,輸出應立即可用。我不明白爲什麼這沒有奏效。看起來我必須按照你的建議去做。 – Jacob

+3

這沒有幫助。所有這些都會在你的*輸入緩衝區*上禁用緩衝。但是有問題的緩衝是在它的*輸出緩衝區*中的ping程序中。你完全無法控制。 –