在Linux上跨进程共享数据

在我的应用程序中,我有一个过程,把一个孩子分出来,说child1,这个subprocess在磁盘上写一个巨大的二进制文件并退出。 父进程然后分出另一个subprocesschild2,它读取这个巨大的文件做进一步处理。

文件转储和重新加载正在使我的应用程序变得缓慢,我正在考虑完全避免磁盘I / O的可能方法。 我已经确定的可能的方法是RAM磁盘或tmpfs。 我可以以某种方式在我的应用程序内部实现ram-disk或tmpfs吗? 或者还有什么其他方式可以完全避免磁盘I / O,并可靠地跨进程发送数据。

Solutions Collecting From Web of "在Linux上跨进程共享数据"

如果两个子进程不同时运行,管道或套接字将无法工作 – 它们的缓冲区对于“巨大的二进制文件”来说太小了,第一个进程将阻塞等待读取数据的任何事情。

在这种情况下,你需要某种共享内存。 您可以使用SysV IPC共享内存API,POSIX共享内存API(在最近的Linux上内部使用tmpfs)或直接在tmpfs(通常挂载在/ dev / shm,有时在/ tmp)文件系统上使用文件。

命名管道正是你想要的。 您可以将数据写入数据并从数据中读取数据,但不需要将数据存储在磁盘上。

您可以使用管道,套接字,并利用Linux内核的sendfile()splice()功能(它们可以避免数据复制)。

在分叉之前创建一个匿名的共享内存区域,然后所有的孩子都可以在fork之后使用它:

 char *shared = mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); 

请注意,共享内存时需要一些同步机制。 实现这一点的一个方法是在共享内存区域内放置一个互斥锁或信号量。

产生两个进程,让他们通过套接字传输数据。 TCP将是最容易入门的,但如果您想要更高效一点,请使用Unix Domain Sockets。 这假设你不关心写入磁盘本身的数据。

您可以使用管道在进程之间传递数据。 这是一个很好的大纲和示例实现。

在你的情况下,第一个子进程child1在child2存在之前退出,所以套接字通信或使用未命名的管道将无济于事,

但是共享内存可以完成以下工作:创建一个共享内存段,对child1中的所有内容具有读取权限,并在该共享内存中执行文件转储任务。在child2中,将共享内存段附加到当前进程空间并读取转储的数据。