如何将程序变成deamon程序

我有时会写这样的程序来处理离线数据:

load_model() //this may cost lots of time while(cin >> inputs) { result = process_input(inputs) cout << result } release_model() 

这工作正常,如果我只需要处理离线数据。 但是,当数据一个接一个的时候我就陷入了困境。 由于每次都需要加载模型,这很耗时。

我想知道是否有任何方法将此程序转换成一个服务,而无需修改程序本身。 例如,我可以将cin和coutredirect到两个命名pipe道:

 program < namedpipe_in > namedpipe_out 

我可以像这样把input放到namedpipe_in中

 cat input > namedpipe_in 

并在另一个pipe道中读取结果:

 cat namedpipe_out 

但是,这个解决scheme是行不通的,因为一旦我把一些东西给了namedpipe_in,cat操作之后pipe道就会closures,程序退出。

我的问题是如何解决这个问题,使pipe道看起来更像是一个队列,而不是一个内存缓冲区。

感谢您的阅读时间。

也许我误解了你的问题。 请纠正我,如果这不是你正在寻找。

为了模拟你的例子,我写了一个简单的C ++程序,它只是接收每个输入字符串并反转它:

 #include <iostream> #include <string> #include <algorithm> int main() { std::cout << ":start:" << std::endl; std::string str; while(std::cin >> str) { std::reverse(str.begin(), str.end()); std::cout << str << std::endl; } } 

我的示例程序的输出二进制文件是strflipper

我有另一个名为in.log的文件,它只是通过touch in.log创建的输入文件。

现在我打电话

 tail -f in.log | ./strflipper > out.log 

如果我添加一些东西到不同的终端输入日志,输出日志得到调整,如下所示:

 $ echo "abc" >> in.log $ echo "foo" >> in.log $ echo "bar baz" >> in.log $ cat out.log :start: cba oof rab zab 

这当然是我的预期产出。 只要我不杀了程序,我添加到in.log任何东西都会在该循环中自动处理,而不会杀死或重新启动strflipper