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

C++ 在C+中的多个程序之间本地共享数据(如使用套接字)+;,c++,linux,stream,buffer,C++,Linux,Stream,Buffer,我的目标是在多个程序之间发送/共享数据。以下是我想到的选择: 我可以使用文件,但更喜欢使用我的RAM,因为它通常更快 我可以使用套接字,但这需要大量的地址信息,而这些信息对于本地内容是不必要的。还有港口 我可以向其他人询问一种有效的方法。 我选择了最后一个 那么,从一个程序向另一个程序发送数据的有效方法是什么呢?例如,它可能使用一个缓冲区,将字节写入其中,等待接收器将第一个字节标记为“已读”(基本上是写入的字节以外的任何内容),然后再次写入,但我将把缓冲区放在哪里,如何使两个程序都可以访问它

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

  • 我可以使用文件,但更喜欢使用我的RAM,因为它通常更快
  • 我可以使用套接字,但这需要大量的地址信息,而这些信息对于本地内容是不必要的。还有港口
  • 我可以向其他人询问一种有效的方法。
我选择了最后一个

那么,从一个程序向另一个程序发送数据的有效方法是什么呢?例如,它可能使用一个缓冲区,将字节写入其中,等待接收器将第一个字节标记为“已读”(基本上是写入的字节以外的任何内容),然后再次写入,但我将把缓冲区放在哪里,如何使两个程序都可以访问它?或者,也许其他的东西也能起作用


我使用linux。

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

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


看看这个。

关于管道和管道呢?如果您在linux环境中,这是一种允许两个程序共享数据的方法。

您可能想看看

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

  • 共享内存

  • 内存映射文件

  • 信号量、互斥量、条件变量和可升级的互斥量类型,以将它们置于共享 内存和内存映射文件

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

  • 文件锁定

  • 相对指针

  • 消息队列


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

主要问题仍然是同步问题

使用套接字(如果所有进程都在同一台机器上,那么可能是比TCP/IP更快的套接字)的优点是使我们的代码易于移植到希望在多台机器上运行多个进程的环境中

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

您应该大致了解应用程序预期的带宽和延迟。 (如果您需要每毫秒共享几十兆字节,或每十分之一秒共享数百千字节,则情况不同)

我建议学习更多关于XDR、ASN1、JSON、YAML等技术、格式和库的知识


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

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

但是,如果您使用套接字(多播套接字),那么实现将有点困难,但是可伸缩性和可维护性非常容易。你不必担心有多少应用程序在等待数据,你只需多播,它们就会监听数据并进行处理。无需等待信号量(共享内存同步技术)读取数据

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

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

问候,

要回答您的问题,请执行以下操作:

使用文件可能不是最好的方式,文件通常不用于传递内部流程信息。请记住,操作系统必须打开、读取、写入和关闭它们。但是,它们用于锁定()

使用pipestream()可以获得最高性能,但在Linux中很难做到这一点。您必须重定向stdin、stdout和stderr。这必须针对每个内部流程进行。因此,它在两个应用程序中都能很好地工作,但除此之外,它会变得非常棘手


我最喜欢的解决方案是使用socketpairs()。它们非常健壮,易于设置。但是,如果您使用多个应用程序,您必须准备某种类型的池来访问这些应用程序。

那么,什么是FIFO以及如何创建管道?哦,我想我会查一下的。很抱歉,当你发布评论时我正在编辑,试着查找第一个链接谢谢,看起来很棒。我会试试。使用管道实际上比使用其他IPC机制更糟糕,比如共享内存、消息队列或内存映射文件。可以使用很多IPC方法。请分享您的程序需要如何沟通的更多细节?它是更具发送/接收性质还是共享一些内存块?它更像是数据流或静态数据块?@MichałŠrajer我考虑在某个时候创建“本地服务器”,例如捕获事件并允许其他程序读取它,但我主要问这个问题,因为我只是好奇它是如何工作的。不管它是一个流还是一个静态块,这都不重要,因为我没有一个真正的目标。花点时间回顾一下每个流行IPC的优缺点。如果你选对了,这可能会节省你很多时间。好的,我现在就试试这些IPC。我想我只是不喜欢这个名字。没关系,这些管子很棒。听起来很有趣。我可能