2012-09-05 29 views
-2

Linux終端我可以在終端使用打開程序:控制用C++程序

stringstream s; 
s<<"./~/rajat/app -parameter"; 
system(s.str().c_str()); 

我的應用程序不斷在終端運行,我想從同一個程序中要做的就是關閉這個應用程序什麼,使用新參數再次打開它。這個怎麼做?

+0

您需要提供一些方法來通過管道(或其他IPC機制)從外部控制'app'或使其響應信號(例如SIGHUP),並且您的控制應用程序可以使用這些方法來終止它,然後根據需要重新執行它。 – Rook

+0

你能否告訴我負面投票的原因? – rajat

回答

3

您不能使用system來做到這一點。從(BSD)man 3 system

調用進程用於殼來完成執行該命令,忽略SIGINT和SIGQUIT和阻塞SIGCHLD等待

因此,您的應用程序將阻止,直到啓動的程序完成或終止。

你可以得到你想要的,而不是推出使用fork/exec你的程序的行爲 - 男人頁herehere。這就是system正在做的事情。您將啓動子流程並在您的應用中保持控制。

使用fork,您將獲得啓動的進程的進程ID,並使用該ID進行處理。使用kill終止程序 - 手冊頁here - 然後重新啓動程序。

四處尋找fork/exec的例子,這個網站上可能有不止幾個。

+0

您獲得了所請求行爲的一半,但另一半很容易實施。 'fork()'返回一個進程ID,然後在需要時使用'kill(pid,signal)'來終止衍生進程。 – Rook

+0

@致謝,添加了關於使用'kill'的註釋。 – pb2q

2

system()只允許您啓動另一個進程並取回退出代碼。您無法控制其他進程的生命週期。

如果要啓動其他進程並對其進行控制,則需要使用其他方法。經典的做法是將fork()你自己的進程分成兩個,exec()這個子進程中的其他進程。然後父母會從fork()呼叫中獲得孩子的PID,然後可以在要終止時向父母發送適當的信號給父母。

這有點麻煩(特別是一旦你開始不得不處理SIGHUP和清理殭屍進程),但我不知道一個標準或Boost庫爲你做了討厭的位。您應該在開始手動編寫之前檢查它。

如果你確實去了fork(),網上有很多指南可以幫助你瞭解幾十年來圍繞它的具體情況和習慣用法。

+0

你可以添加一個例子嗎? – rajat