2011-05-12 37 views
2

我想知道如何在不使用輸入輸出到文件系統或外部數據庫的情況下讓存儲容器在多個執行時間(運行)內不會丟失內容的最佳解決方案。跨越多次運行的持久存儲

說我有一個類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主機上。

+0

這聽起來很困難。你能告訴我們更多關於「多次運行」的含義嗎?這些會有關係嗎?他們會以緊密的順序運行嗎?使用小文件存儲信息可能會更容易。 – 2011-05-12 13:38:02

回答

0

看看Linux管道進行進程間通信。

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

+0

感謝您的回答!這適用於第一次通話。但是如何在下次運行中連接到前一次運行的管道? – ritter 2011-05-12 11:09:06

0

命名管道是單向的。如果你想要不阻塞,儘管你可能想嘗試消息隊列路由。以下是系統調用http://linux.die.net/man/2/msgctl之一的鏈接,您可以查看其他來電。

+0

我不確定命名管道是否在此工作。是否有可能連接到另一個進程的開放管道?孩子不會退出執行等待請求的服務循環。但正如問題中提到的,'父'在幾個不同的過程中執行。 你是什麼意思的消息隊列路線? – ritter 2011-05-12 11:16:03

+0

更新回答以上 – ColWhi 2011-05-12 11:21:40

+0

如果您的惡魔首先打開,並且始終從管道讀取,則所有客戶端都可以寫入並退出。 – ColWhi 2011-05-12 11:22:21