进程间通信之共享内存
1.共享内存机制
是允许两个或多个进程(不相关或有亲缘关系)访问同一个逻辑内存的机制。它是共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。
2.两种常用共享内存方式
-
System V版本的共享内存 shmm
1.多个进程直接共享内存 -
文件映射 mmap
1.文件进行频繁读写,将一个普通文件映射到内存中
2.将特殊文件进行匿名内存映射,为关联进程提供共享内存空间
3.为无关联的进程提供共享内存空间,将一个普通文件映射到内存中
3.补充一下:linux中shm与shmm的区别
因为我了解到了shmm,又了解到了shm,所以很疑惑它们的区别
在Linux中,shm和shmm都是与共享内存相关的概念,但它们有不同的含义和用途。
shm是指共享内存段,是一种进程间通信机制,通过将同一个内存区域映射到多个进程的虚拟地址空间中,实现不同进程之间的数据共享。shm可以利用shmget、shmat等系统调用来创建和操作共享内存。
shmm是指共享内存管理器,是=管理共享内存的一种机制,它可以自动地为进程分配和释放共享内存,并提供了一些内存管理的功能,如内存分配、内存映射、内存释放等。shmm
是Linux内核中的一部分,可以通过系统调用shm_open
、shm_unlink
等来使用。
因此,可以看出shm与shmm的主要区别在于它们的作用和实现方式不同。shm是一种进程间通信机制,而shmm是一种内存管理机制。在实际使用中,根据需要选择合适的机制进行共享内存操作。
4.IPC通信System V版本的共享内存shm
- ftok函数
生成key标识符
key_t ftok(const char *pathname,int proj_id)
创建
一个共享内存块,返回这个共享内存块的标识符shmid
int shmget(key_t key,size_t size,int shmflg)
参数说明:size
- 申请的共享内存的大小,为4k
的整数倍;
shmflg
- IPC_CREAT
创建新的共享内存,已存在 使用IPC_EXCL
- 挂接共享内存(将进程地址空间挂接到物理空间,可以有多个挂接)
void *shmat(int shmid,const void *shmaddr, int shmflg)
参数说明:shmid
- 挂接的共享内存ID(即第2步创建的
).
shmaddr
- 一般为0,表示连接到由内核选择的第一个可用地址上
shmflg
- 一般为0
- 取消共享内存映射
int shmdt(const void *shmaddr);//即第3步函数的返回值
- 用于控制共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数说明: shmid
- 由shmget
返回的共享内存标识码(即第2步拿到的
)
cmd
- 将要采取的动作(可取值:IPC_STAT
、IPC_SET
、IPC_RMID
)
buf
- 指向一个保存着共享内存的模式状态和访问权限的数据结构
- 举例
//shmwrite.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
struct Conn_stat
{
int count;//ip地址出现的次数
char ip[64];
};
int main()
{
void *shm = NULL;
int shmid = 0, i = 0;
struct Conn_stat stat = {
0,"127.0.0.1"};
//创建共享内存
shmid = shmget((key_t)1234, sizeof(struct Conn_stat), 0666|IPC_CREAT);
if(shmid == -1)
{
fprintf(stderr, "shmget failed\n");
exit(1);
}
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, (void*)0, 0);
if(shm == (void