在Linux上跨进程共享数据

时间:2011-08-18 12:20:39

标签: c linux ipc fork

在我的应用程序中,我有一个向子进行分叉的进程,比如child1,这个子进程在磁盘上写了一个巨大的二进制文件并退出。然后父进程分叉另一个子进程child2,该进程读取这个巨大的文件以进行进一步处理。

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

7 个答案:

答案 0 :(得分:3)

如果两个子进程不同时运行管道或套接字对你不起作用 - 它们的缓冲区对于“巨大的二进制文件”来说太小了,第一个进程将阻止等待任何东西进行读取数据。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

named pipe正是您想要的。您可以将数据写入其中并从中读取数据,就像它是一个文件一样,但不需要将其存储在磁盘上。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

生成两个进程并让它们通过套接字传输数据。 TCP最容易上手,但如果你想提高效率,可以使用Unix Domain Sockets。这假设您不关心正在写入磁盘的数据。

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

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

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