Background-Process

在後台執行 C++ 編譯程序並在需要時發送輸入

  • January 23, 2018

我有一個用 C++ 編寫的編譯程序,用於具有這種結構的 UNIX 環境:

int main(){
...
LoadEngine()
...
while(1){
   std::cin >> buffer;
   ...
   ExecuteFunction(buffer);
}
}

載入引擎需要很長時間,所以我嘗試先在後台啟動程序,然後在需要時發送輸入。

執行程序並在末尾附加標準與符號似乎不會使程序在後台執行,而是在std::cin處停止,直到從控制台接收到輸入,並在從控制台接受輸入後停止。

如何執行程序以使程序在後台連續執行並接收輸入並在需要時執行該功能?

編輯:最終產品是一個辨識語音的小型設備(RaspberryPi),並根據辨識的單詞做一些事情。我擁有的程序是設備根據單詞輸入執行某些操作的部分,並且單詞輸入對應於上面程式碼片段中的變數緩衝區

所以std::cin部分是一個虛擬行程式碼,我用它來測試我的部分程式碼是否在後台程序中啟動(以載入引擎)並執行它設計的任何操作。

編輯 2:為了闡明我想要實現的目標,程序從語音辨識器獲取輸入並執行操作(例如,從輸入合成語音,向 LED 發送信號等)。文本輸入可以直接從控制台(我的程式碼目前正在執行的操作)或我不了解的其他方法獲取。輸入堅持的唯一事情是它必須是文本,並且被發送來自另一個辨識語音的程序(由其他開發人員處理)。所以沒有具體說明具體的方法。我只需要擔心我的程序,它從文本輸入執行一個函式(即來自程式碼片段的*緩衝區)。*所以一般結構看起來像這樣:

Int main(){
LoadEngine()
while(1){
   buffer = ReceiveInput();
   ExecuteFunction(buffer);
}}

ReceiveInput ()部分目前實現為std::cin。它實際上可以是任何方法,只要引擎在開始時載入一次,並且程序能夠從輸入執行ExecuteFunction直到設備關閉。

這既尷尬又不方便,但可能不如其他答案:

每次您的程序要求輸入時:

  1. 進入 shell 提示符——我的意思是啟動你的程序的 shell。(即,您不只是在前台執行“引擎”程序這一事實表明您正在使用終端進行其他操作,例如編輯文件。每次您的程序要求輸入時,您都需要保存並退出編輯器,然後返回到您的主 shell。或者您可以暫停編輯器;但這會使下一步變得更加複雜。)
  2. 鍵入fg(當然後跟Enter)以將您的後台作業置於前台。如果您有多個後台作業(如上所述),請執行您需要做的事情以將您的“引擎”程序置於前台。
  3. 與程序互動。
  4. 當它準備好恢復執行(計算等)一段時間後,按Ctrl+ Z,然後按bg (後跟Enter)。

只要程序執行,就重複上述操作。

這不太可能。在這種情況下,您通常需要監聽網路埠、accept() 連接並從中讀取數據,然後做任何您需要的事情。然後您還需要一些客戶端應用程序來發送數據。這就是後台應用程序通常的工作方式。

引用自:https://unix.stackexchange.com/questions/225762