【问题标题】:Persistent storage across several runs跨多次运行的持久存储
【发布时间】:2011-08-24 00:21:12
【问题描述】:

我想知道在不使用文件系统或外部数据库的输入输出的情况下,让存储容器在多个执行时间(运行)内不会丢失其内容的最佳解决方案是什么。

假设我有一个存储整数的类 foo()。从 main() 我想调用一个添加整数的方法,并且该类不会忘记它以前的内容。

//
// Data storage accross different runs
// This should go into the daemon process
//

#include<iostream>
#include<list>

using namespace std;

class foo {
public:
  foo(int add): add(add) {}
  void store(int i) {
    vec.push_back( i + add);
  }
private:
  list<int> vec;
  int       add;
};

主函数应该检查一个已经在运行的守护进程——如果没有启动它。

//
// Main program. Should check whether daemon runs already, if not starts it.
//

void main(int argc, char *argv[]) {

  // if (daemon is not running)
  //  start daemon( some_number )

  // call daemon::add( atoi(argv[1]) );
}

如何使用共享库或守护进程最好地做到这一点?存储和调用程序在同一个 Linux 主机上。

【问题讨论】:

  • 这听起来很难。你能告诉我们更多关于“几次运行”的意思吗?这些会有关系吗?他们会按顺序运行吗?使用小文件存储信息可能更容易。

标签: c++ shared-libraries daemon


【解决方案1】:

查看 Linux Pipes 进行进程间通信。

http://linux.die.net/man/2/pipe

【讨论】:

  • 感谢您的回答!这适用于第一次通话。但是如何在下一次运行中连接到上一次运行的管道?
【解决方案2】:

命名管道是一种方法。如果您想要非阻塞,但您可能想尝试消息队列路由。这是一个系统调用http://linux.die.net/man/2/msgctl的链接,您可以从那里查看其他调用。

【讨论】:

  • 我不确定命名管道是否在这里工作。是否可以连接到另一个进程的开放管道?孩子不会退出执行等待请求的服务循环。但正如问题中提到的,“父”在几个不同的进程中执行。消息队列路由是什么意思?
  • 如果你的恶魔首先被打开,并且总是从管道中读取,那么所有客户端都将能够写入并退出。
  • 另一个考虑因素是当你“完成”你正在做的事情时,你将如何得到这个数字。
【解决方案3】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2016-02-02
    • 2012-02-02
    相关资源
    最近更新 更多