我有时会编写这样的程序来处理离线数据:
load_model() //this may cost lots of time
while(cin >> inputs)
{
result = process_input(inputs)
cout << result
}
release_model()
如果我只需处理离线数据,这样可以正常工作。但是,当数据逐一出现时,我遇到了麻烦。因为我每次都必须加载模型,这很费时间。
我想知道是否有办法将此程序转换为服务而不修改程序本身。例如,我可以将cin和cout重定向到两个命名管道:
program < namedpipe_in > namedpipe_out
我可以将输入放入namedpipe_in中,就像这样
cat input > namedpipe_in
并在另一个管道中读取结果:
cat namedpipe_out
但是,这个解决方案不起作用,因为一旦我对namedpipe_in有所帮助,管道将在cat操作后关闭并且程序退出。
我的问题是如何解决这个问题并使管道看起来更像是队列而不是内存缓冲区。
感谢您抽出时间阅读。
答案 0 :(得分:1)
也许我误解了你的问题;如果这不是你想要的,请纠正我。
为了模拟你的例子,我写了一个简单的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
。