在C ++中的多个程序之间本地共享数据(如使用套接字)

时间:2011-12-20 12:54:31

标签: c++ linux stream buffer

我的目标是在多个程序之间发送/共享数据。这些是我想到的选项:

  • 我可以使用文件,但更喜欢使用我的RAM,因为它通常更快
  • 我可以使用套接字,但这需要很多地址信息,这些信息对于本地内容来说是不必要的。还有港口。
  • 我可以向其他人询问有效的方法。

我选择了最后一个。

那么,将数据从一个程序发送到另一个程序的有效方法是什么?例如,它可能使用缓冲区并向其写入字节并等待接收方将第一个字节标记为“read”(基本上除了写入的字节之外的任何其他内容),然后再写一遍,但是我将放入缓冲区,我将如何为两个程序设置 access ?或者其他东西也可能有效?

我使用linux。

6 个答案:

答案 0 :(得分:4)

在同一主机上运行的进程的最快IPC是共享内存。

简而言之,多个进程可以访问相同的内存段。

请参阅此tutorial

答案 1 :(得分:4)

fifos和管道怎么样?如果你在Linux环境中,这是允许2个程序共享数据的方法。

答案 2 :(得分:3)

您可能需要查看Boost.Interprocess

  

Boost.Interprocess简化了通用进程间通信和同步机制的使用,并提供了大量的内容:

     
      
  • 共享内存。

  •   
  • 内存映射文件。

  •   
  • 将信号量,互斥量,条件变量和可升级的互斥锁类型放在共享中   内存和内存映射文件。

  •   
  • 这些同步对象的命名版本,类似于UNIX / Windows sem_open / CreateSemaphore API。

  •   
  • 文件锁定。

  •   
  • 相对指针。

  •   
  • 消息队列。

  •   

答案 3 :(得分:2)

在Linux上,当使用文件时,它们通常都在缓存中,因此您不会经常读取磁盘,并且可以使用“{3}}之类的”RAM“文件系统(实际上tmpfs使用虚拟内存,所以RAM +交换,实际上文件大多数时间都保存在RAM中。

主要问题仍然是同步

使用套接字(可能是,如果所有进程都在同一台机器上,tmpfs套接字比TCP / IP套接字快),这样可以使我们的代码轻松移植到您喜欢运行的环境中几台机器上的几个过程。

您还可以使用现有框架进行并行执行,例如AF_UNIXMPI等等。

您应该大致了解应用程序所需的带宽和延迟。 (如果你需要每毫秒分享数十兆字节,或者每十分之几秒分享数百千字节,那就不一样了。)

我建议您详细了解Corba技术,格式和库,如XDR,ASN1,JSON,YAML,serializations11n等。

发送或共享数据不一样。当您发送(并接收)数据时,您会考虑传递消息。当您共享数据时,您会考虑共享内存。编程风格非常不同。

答案 4 :(得分:2)

回答你的问题:

使用文件可能不是最好的方法,文件通常不用于传递内部进程信息。记住操作系统必须打开,读取,写入,关闭它们。然而,它们用于锁定(http://en.wikipedia.org/wiki/File_locking)。

使用pipestream(http://linux.die.net/man/3/popen)获得的最高性能,但在Linux中很难做到正确。您必须重定向stdin,stdout和stderr。必须为每个内部过程完成此操作。所以它适用于两个应用程序,但超出了它,它变得非常毛茸茸。

我最喜欢的解决方案,使用socketpairs(http://pubs.opengroup.org/onlinepubs/009604499/functions/socketpair.html)。这些非常强大且易于设置。但是,如果您使用多个应用程序,则必须准备某种池以访问应用程序。

答案 5 :(得分:0)

共享内存最适合在进程之间共享数据。但它需要大量的同步,如果超过2个进程共享数据,那么同步就像独眼巨人。 (单眼 - 单共享内存)。

但是如果你使用套接字(多播套接字),那么实现起来就不会那么困难,但可扩展性和可维护性非常容易。您无需费心等待有多少应用程序等待数据,您只需多播即可收听数据和流程。无需等待信号量(共享内存同步技术)来读取数据。

因此可以减少读取数据的时间 共享内存 - 等待信号量,读取数据并处理数据 套接字 - 接收数据,处理数据。

通过套接字,性能,可扩展性和可维护性将增加优势。

的问候,
SSuman185