进程间通信之共享内存

本文详细介绍了Linux下的共享内存机制,包括两种常用方式:System V的shmm和文件映射mmap。讨论了shm与shmm的区别,shm作为IPC通信机制,而shmm是内存管理机制。此外,还探讨了System V版本的shm系统调用以及mmap函数的应用。
摘要由CSDN通过智能技术生成

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_openshm_unlink等来使用。

因此,可以看出shm与shmm的主要区别在于它们的作用和实现方式不同。shm是一种进程间通信机制,而shmm是一种内存管理机制。在实际使用中,根据需要选择合适的机制进行共享内存操作。

4.IPC通信System V版本的共享内存shm

  1. ftok函数生成key标识符
key_t ftok(const char *pathname,int proj_id)
  1. 创建一个共享内存块,返回这个共享内存块的标识符shmid
int shmget(key_t key,size_t size,int shmflg)

参数说明:size - 申请的共享内存的大小,为4k的整数倍;
shmflgIPC_CREAT 创建新的共享内存,已存在 使用IPC_EXCL

  1. 挂接共享内存(将进程地址空间挂接到物理空间,可以有多个挂接)
void *shmat(int shmid,const void *shmaddr, int shmflg)

参数说明:shmid - 挂接的共享内存ID(即第2步创建的).
shmaddr - 一般为0,表示连接到由内核选择的第一个可用地址上
shmflg - 一般为0

  1. 取消共享内存映射
int shmdt(const void *shmaddr);//即第3步函数的返回值
  1. 用于控制共享内存
      在这里插入图片描述
int shmctl(int shmid, int cmd, struct shmid_ds  *buf);

参数说明: shmid - 由shmget返回的共享内存标识码(即第2步拿到的)
cmd - 将要采取的动作(可取值:IPC_STATIPC_SETIPC_RMID
buf - 指向一个保存着共享内存的模式状态和访问权限的数据结构

  1. 举例
//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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏过山河,踏过海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值