乐闻世界logo
搜索文章和话题

How to share memory between processes created by fork()?

5 个月前提问
4 个月前修改
浏览次数38

1个答案

1

在使用 fork() 创建新进程后,通常父进程与子进程的内存是分开的。在Linux或类Unix系统中,fork() 创建的子进程开始时是父进程的一个精确副本,拥有与父进程相同的内存映像,但默认情况下这种内存是分开的,属于"写时复制"(copy-on-write)机制。

如果您想在 fork() 创建的进程之间共享内存,可以使用以下几种方法:

1. 使用共享内存对象(POSIX Shared Memory)

POSIX共享内存是一种在不同进程之间共享内存的有效方式。您可以使用 shm_open() 创建一个共享内存对象,然后使用 ftruncate() 调整大小,接着通过 mmap() 将其映射到进程的地址空间。

示例:

c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #include <fcntl.h> #include <sys/wait.h> int main() { const int SIZE = 4096; const char *name = "OS"; // 创建共享内存对象 int shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); ftruncate(shm_fd, SIZE); // 映射共享内存对象 void *ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); pid_t pid = fork(); if (pid == 0) { // 子进程 char *message = "Hello, World!"; sprintf(ptr, "%s", message); exit(0); } else { // 父进程 wait(NULL); printf("%s\n", (char *)ptr); shm_unlink(name); } return 0; }

在这个示例中,子进程写入共享内存,父进程读取相同的共享内存。

2. 使用 System V 共享内存

System V 共享内存是另一种形式的共享内存,在Linux系统上也支持。它使用 shmget() 创建共享内存段,shmat() 将共享内存段连接到进程的地址空间中。

3. 使用文件映射

你也可以创建一个文件,并将这个文件映射到内存中来实现进程间的共享内存。这可以通过 mmap() 实现,不使用 shm_open() 而是直接对一个普通文件操作。

这些方法可以有效地在通过 fork() 创建的进程间共享内存,每种方法都适用于不同的场景和需求。考虑到具体的应用场景和系统资源限制来选择合适的共享内存方法非常重要。

2024年6月29日 12:07 回复

你的答案