我有一个用 C++ 编写的针对 UNIX 环境的编译程序,它具有以下结构:
int main(){
...
LoadEngine()
...
while(1){
std::cin >> buffer;
...
ExecuteFunction(buffer);
}
}
加载引擎需要相当长的时间,因此我尝试先在后台启动程序,然后在需要时发送输入。
在末尾附加标准&符号运行程序似乎不会使程序在后台运行,而是停止在标准::辛直到从控制台接收到输入,并在从控制台接受输入后停止。
如何执行程序,使程序在后台连续运行并在需要时接收输入并执行函数?
编辑:最终产品是一个小型设备(RaspberryPi),它可以识别语音,并根据识别的单词执行某些操作。我的程序是设备根据单词输入执行某些操作的部分,并且单词输入对应于变量缓冲从上面的代码片段。
所以标准::辛部分是一个虚拟行代码,我用它来测试我的部分代码在后台进程中启动(以加载引擎)并执行其设计的任何操作。
编辑2:为了澄清我想要实现的目标,该程序从语音识别器获取输入并执行操作(例如,从输入合成语音,向 LED 发送信号等)。文本输入可以直接从控制台获取(我的代码当前正在这样做),或者我不了解的其他方法。输入遵循的唯一一点是它必须是文本,并且是从另一个识别语音的程序(由其他开发人员处理)发送的。所以具体方法没有具体说明。我所需要担心的是我的程序,它从文本输入执行一个函数(即缓冲来自代码片段)。所以一般结构看起来像这样:
Int main(){
LoadEngine()
while(1){
buffer = ReceiveInput();
ExecuteFunction(buffer);
}}
哪里的接收输入()部分目前实施为标准::辛。其实可以是任何方法,只要一开始加载一次引擎,程序就能够执行执行函数从输入到设备关闭。
答案1
这不太可能。在这种情况下,通常您需要监听网络端口、accept() 连接并从中读取数据,然后执行您需要的任何操作。然后您还需要一些客户端应用程序来发送数据。这就是后台应用程序通常的工作方式。
答案2
这是尴尬和不方便的,但可能比其他答案要少:
每次你的程序要求输入时:
- 进入 shell 提示符 — 我指的是启动程序的 shell。 (也就是说,您不只是在前台运行“引擎”程序,这一事实表明您正在使用终端执行其他操作,例如编辑文件。每次程序要求输入时,您都需要保存并退出编辑器,然后返回到主 shell。或者您可以暂停编辑器;但这会使下一步变得更加复杂。)
- 键入
fg
(当然后跟Enter)将后台作业带入前台。如果您有多个后台作业(如上所述),请执行您需要执行的操作以将“引擎”程序置于前台。 - 与程序交互。
- 当它准备好恢复运行(计算等)一段时间时,按Ctrl+ Z,然后
bg
按(后跟Enter)。
只要程序运行,就重复上述操作。
答案3
您需要向您的应用程序发送一些唤醒呼叫,以便它知道何时侦听输入以及在哪里期待输入(因为在后台运行它会将其与终端进程分开)。更好的解决方案是(恕我直言)创建单独的程序作为引擎的接口 - 因为引擎看起来像你的问题。提供一组与其通信的函数,并编写简单的脚本,运行时将输入发送到引擎。引擎将在后台运行,其他程序将直接连接到它。这是我目前能想到的最好的办法。