共享内存是一种进程间通信的方式,它允许多个进程访问同一个物理内存区域,从而可以实现数据的共享。在共享内存机制中,创建并维护一个共享内存区域的进程被称为共享内存的拥有者。其他进程可以通过映射该共享内存区域到自己的地址空间中来访问共享内存中的数据,从而实现进程间的通信和数据共享。
共享内存具有以下优点:
-
高效性:共享内存的访问速度非常快,因为它不需要进行数据复制和传输,而是直接在内存中进行访问。
-
灵活性:共享内存可用于实现不同类型的进程间通信,包括线程间通信和不同计算机之间的通信。
-
易于使用:共享内存是一个非常通用的通信机制,因为它可以使用标准的共享内存API在不同的操作系统和编程语言中实现
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/shm.h> #define SHM_SIZE 1024 int main(int argc, char **argv) { int shmid; key_t key; char *shm, *s; /* 生成唯一的键值 */ key = ftok(".", 'm'); /* 创建共享内存区 */ shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666); if (shmid < 0) { perror("shmget"); exit(1); } /* 将共享内存区映射到当前进程空间 */ shm = (char *) shmat(shmid, NULL, 0); /* 在共享内存区中写入数据 */ s = shm; for (int i = 0; i < SHM_SIZE; i++) { *s++ = 'a'; } /* 等待另一个进程读取数据 */ sleep(5); /* 从共享内存区中读取数据 */ s = shm; for (int i = 0; i < SHM_SIZE; i++) { putchar(*s++); } /* 删除共享内存区 */ shmctl(shmid, IPC_RMID, NULL); return 0; }