2015-03-31 81 views
1

我的程序使用fork()/ execvp()啓動一個幫助程序,我想在程序的GUI中顯示幫助程序的輸出。幫助程序的輸出應該在我的程序的GUI中嵌入的listview小部件中逐行顯示。當然,我可以將輸出重定向到一個文件,等到助手完成後再讀取整個文件並顯示出來。但這不是一個最佳解決方案。理想情況下,我希望顯示助手的輸出,因爲它是發送到標準輸出,即逐行,而助手仍在工作。重定向程序輸出到我的程序

這樣做的建議方法是什麼?

從我的頭頂開始,想到的是以下解決方案,但我不確定它是否可以工作,因爲一個進程將寫入該文件而另一個進程正在嘗試讀取該文件:

1)叉後開始像這樣使用execvp()輔助():

./helper > tmpfile 

2)在那之後,我的程序試圖打開 「TMPFILE」 使用open(),然後使用select()等待,直到有文件讀取。一旦我的程序獲得了一行輸出,它將它發送到我的GUI的listview小部件。

這是應該怎麼做,或者我完全在錯誤的軌道上嗎?

謝謝!

+0

關於使用管道如何?然後你的程序可以簡單地從'stdin'中讀取(是的,你仍然可以使用'select')。所以'./helper |而不是使用your_program'。 – 2015-03-31 15:53:19

+0

謝謝,我甚至沒有想到那個......可能是最簡單的解決方案。 – Andreas 2015-03-31 15:59:15

回答

1

您應該打開pipe並使用select監視子進程的進度。如果您只需要單向通信,也可以使用popen,在這種情況下,您將通過致電fileno返回FILE*來獲取文件描述符。

請參見:

+0

謝謝,popen()看​​起來正是我正在尋找的東西。只是出於好奇:我怎麼用pipe()而不是popen()來實現?那麼我該如何啓動幫手程序? – Andreas 2015-03-31 15:58:31

+1

@Andreas對於管道的做事方式,你可以在這裏找到一個教程:http://www.microhowto.info/howto/capture_the_output_of_a_child_process_in_c.html,但顯然作者並不知道'fileno'函數。 – fjardon 2015-03-31 16:03:12

+0

再次,正是我所期待的,非常感謝! – Andreas 2015-03-31 16:06:53

相關問題