C语言 linux上跨进程共享数据

c0vxltue  于 2023-04-29  发布在  Linux
关注(0)|答案(7)|浏览(132)

在我的应用程序中,我有一个进程,它派生出一个子进程,比如child 1,这个子进程在磁盘上写入一个巨大的二进制文件并退出。然后父进程派生出另一个子进程child 2,它读取这个巨大的文件来做进一步的处理。
文件转储和重新加载使我的应用程序变慢,我正在考虑完全避免磁盘I/O的可能方法。我已经确定了可能的方法是ram-disk或tmpfs。我可以在应用程序中实现ram-disk或tmpfs吗?或者有没有其他方法可以完全避免磁盘I/O并可靠地跨进程发送数据。

csbfibhn

csbfibhn1#

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

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

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

72qzrwbm

72qzrwbm2#

如果两个子进程不同时运行,管道或套接字将无法为您工作-它们的缓冲区对于“巨大的二进制文件”来说太小,第一个进程将阻塞等待任何阅读数据的内容。
在这种情况下,您更需要某种共享内存。您可以使用SysV IPC共享内存API、POSIX共享内存API(在最近的Linux上内部使用tmpfs)或直接使用tmpfs文件系统上的文件(通常挂载在/dev/shm上,有时候挂载在/tmp上)。

e5nszbig

e5nszbig3#

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

pzfprimi

pzfprimi4#

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

yyhrrdl8

yyhrrdl85#

生成两个进程并让它们通过套接字传输数据。TCP将是最容易入门的,但如果你想要更高的效率,使用Unix域套接字。这假定您不关心写入磁盘的数据本身。

tvz2xvvm

tvz2xvvm6#

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

9rbhqvlz

9rbhqvlz7#

在您的例子中,第一个子进程child1在child2出现之前就退出了,所以套接字通信或未命名的管道将不会有帮助。
但是共享内存可以完成这项工作:在child1中创建一个具有读取权限的共享内存段,并在该共享内存中执行文件转储任务,在child2中将共享内存段附加到当前进程空间并读取转储的数据。

相关问题