0

我目前正在64位Linux平台上用C(程序A)编写网络数据使用监视器。作为数据包嗅探器,没有太多时间将数据写入文件或数据库而不冒丢失数据包的风险。我可以为此目的使用另一个线程,但我认为更清洁的解决方案(如果存在)是从另一个 C 程序或理想情况下是 python cgi 脚本(程序 B)访问存储在内存中的这些数据。这样,数据将按需提供。内存中的数据只能从程序 B 中读取。这可能吗?如果有怎么办?谢谢。

更新:

我看到这可以使用 mmap() 将数据存储在内存中,并使用 shmget() 来检索它。我听说有人说 shmget 是旧的。还有哪些其他选择?

要传递的二维数组可以大到 5000x4 int 或 5000x15 char。

posix_ipc听起来很有希望作为一种从 python(程序 B)访问共享内存的方式。有谁知道这是否适用于在 C(程序 A)中创建的共享内存?

我下载了 posix_ipc,它有一些非常酷的演示。第一个演示了使用共享内存相互通信的两个进程。这两个进程可以是 C 和 python 的任意组合,并且提供了这四个进程中的每一个的源代码。它看起来是处理我正在尝试做的最有效的方法,但我还没有时间玩它。我会在我这样做时报告。

che 下面的建议听起来也行得通,我将把它作为我的 B 计划。

感谢大家的帮助!

4

4 回答 4

1

使用 SQLite,内存模式。这将为您提供数据库提供的所有好处,而不会占用大量空间。

http://www.sqlite.org/inmemorydb.html

于 2012-10-23T18:47:51.277 回答
1

共享内存听起来像是在两个 C 程序之间执行此操作的最佳方式,尤其是当第二个程序只读取第一个程序写入的统计信息时。

从 Python 获取这个内存可能有点复杂,因为它对于这种语言来说有点低级。最简单的方法可能是让一个 C 程序访问共享内存并以纯文本形式打印信息,然后从 CGI 脚本中调用它。

于 2012-10-23T19:07:32.137 回答
1

关于 posix_ipc:是的,共享内存区域“只是内存”,它们与您访问它们的语言完全无关。

但是,您安排使用该内存的方式可能仅限于“最小公分母”。包含固定长度数据字段的固定长度结构数组将简单易行,文本内容的某些排列也是如此;诸如“具有可变字段和垃圾收集的对象”之类的东西很难在两种语言之间绑定。

作为记录,mmap这是访问共享/可共享内存的一种方式;命令shmget系列(shmgetand shmatshmctl等等)是另一个。将两者混合起来会很困难,而且不是特别有利。(请注意,该名称shmget指的get是共享内存区域,并不一定意味着对该内存的只读访问。)

于 2012-10-23T19:45:36.523 回答
0

如果您需要简单的键/值内存存储,请尝试使用 memcached http://memcached.org/

学习在 Web 应用程序开发中高度使用的技术还有额外的好处

于 2012-10-23T18:50:47.360 回答