有两种方法:shmget
和mmap
。我会谈论mmap
,因为它更现代化、灵活,但如果您更喜欢使用旧的工具,请参考man shmget
(或此教程)。
mmap()
函数可用于分配内存缓冲区,并具有高度可定制的参数来控制访问和权限,并在必要时将它们与文件系统存储关联。
以下函数创建一个可以与其子进程共享的内存缓冲区:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
void* create_shared_memory(size_t size) {
int protection = PROT_READ | PROT_WRITE;
int visibility = MAP_SHARED | MAP_ANONYMOUS;
return mmap(NULL, size, protection, visibility, -1, 0);
}
下面是一个使用上述定义的函数来分配缓冲区的示例程序。父进程将写入一条消息,然后fork,并等待其子进程修改缓冲区。两个进程都可以读写共享内存。
#include <string.h>
#include <unistd.h>
int main() {
char parent_message[] = "hello";
char child_message[] = "goodbye";
void* shmem = create_shared_memory(128);
memcpy(shmem, parent_message, sizeof(parent_message));
int pid = fork();
if (pid == 0) {
printf("Child read: %s\n", shmem);
memcpy(shmem, child_message, sizeof(child_message));
printf("Child wrote: %s\n", shmem);
} else {
printf("Parent read: %s\n", shmem);
sleep(1);
printf("After 1s, parent read: %s\n", shmem);
}
}
shmget()
等,以及使用MAP_ANON
(又名MAP_ANONYMOUS
)的纯mmap()
方法——尽管MAP_ANON
未被POSIX定义。此外,还有POSIXshm_open()
和shm_close()
用于管理共享内存对象。_ […继续…]_ - Jonathan Lefflershm_unlink()
为止),而使用mmap()
的机制需要一个文件和MAP_SHARED
来持久化数据(而MAP_ANON
排除了持久性)。在shm_open()
规范的Rationale部分中有一个完整的示例。 - Jonathan Leffler