2013-07-28 35 views
1

我正在編寫一個C++應用程序(在Linux中),我只想啓動一次應用程序。 (如果它已經開放,那麼使用那一個handle)。啓動一個進程並在C++應用程序中處理它

我也不時地向相同的應用程序提供輸入。例如:

class myapp(): 
     start second application here. 
     work() 
    myapp::work(){ 
     create input 
     provide input to the started/already open second application 
    } 

所以當每一個對象被用於創建MYAPP時間,第二個啓動應用程序(只如果尚未打開)。然後每次將輸入傳遞給應用程序?這可能嗎?我也不想第二個應用程序關閉,除非用戶結束它。 我已經在使用pid和fork來做到這一點。但不知何故,它多次啓動應用程序,我也無法爲此應用程序提供輸入。

希望這已經夠清楚了。我知道已經有很多Q & A可用,但我無法清楚地理解,因此如果我再次提出同樣的問題,我很抱歉?

感謝您的幫助

+1

您想要啓動一個命令行程序或圖形程序嗎?是否有可能通過命令行參數提供需要輸入的信息(許多圖形應用程序也接受一些參數),還是需要直接與應用程序交互? – denisw

+0

@denisw對延遲抱歉。它是一個圖形應用程序(「Wireshark」),是的它通過命令行接受輸入。像'my_application - > STDOUT | wireshark -k -i -'會工作。但是我不是很熟悉如何處理打開的同一個wireshark進程?你能否指點我正確的方向。非常感謝。 – WiData

+0

我應該使用popen嗎?我以前從未使用過。 – WiData

回答

2

popen是這個工作的工具。你傳遞一個命令來執行,然後它返回一個C文件句柄(FILE *),它代表從你的程序到第二個程序的管道。您使用此句柄編寫的所有數據均指向第二個程序的標準輸入。

請注意,這是一個C文件句柄,因此您需要使用C I/O函數(如fprintf)來寫入它。不幸的是,沒有將C文件句柄轉換爲C++輸出流的標準方式。

下面是如何使用popen一個例子,改編自example in the GNU libc manual

FILE *pipe = popen("wireshark -i -k", "w"); // "w" means "write mode" 
if (!pipe) { 
    // execution failed 
    return; 
} 

fprintf(pipe, "Some data"); 
… 

// When you're done with the pipe: 
pclose(pipe); 

您可以確保該程序通過存儲管FILE *在永久變量只啓動一次(例如對象成員變量),你用NULL進行初始化。然後,您可以輕鬆檢查是否已使用pipe != NULL啓動第二個應用程序。

+0

非常感謝。這真的非常有用,而且幾乎奏效。雖然我有一個錯誤,但我認爲這與wireshark的東西有關。再次感謝很多。 – WiData

相關問題