嵌入式系列文章之第五章 进程、线程和进程间通信の第七节 共享内存

嵌入式(Linux)系列文章目录

第五章 进程、线程和进程间通信の第七节 共享内存



前言

本文章采用VMware Workstation Pro进行嵌入式(Linux)系列学习

从零开始,重新学习(嵌入式相关内容)并记录知识点(涉及基础c语言(数据结构)、linux编程、shell脚本、文件io、网络编程)等),同时也是为了方便自身回顾,如有不对的地方请大佬多多指教,谢谢!->欢迎评论区留言


第五章 进程、线程和进程间通信

第七节 共享内存

1.内存映射的基本使用

2.内存映射使用注意事项

3.内存映射实现进程间通信

4.system V共享内存

4.1 目标
  • 了解system V共享内存概念
  • 共享内存使用步骤
  • ftok函数创建key
  • 创建/打开共享内存
  • 映射共享内存
  • 共享内存读写
  • 共享内存控制
4.2 System V IPC(进程间通信)
  • IPC对象包含:共享内存、消息队列和信号灯集
  • 每个IPC对象有唯一的ID用Key关联
  • IPC对象创建后一直存在,直到被显式地删除
  • ipcs/ipcrm
4.3 共享内存
  • 共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝
  • 共享内存在内核空间创建,可被进程映射到用户空间访问,使用灵活
  • 由于多个进程可同时访问共享内存,因此需要同步和互斥机制配合使用
4.4 共享内存使用步骤
  • 生成key
  • 创建/打开共享内存
  • 映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
  • 读写共享内存
  • 撤销共享内存映射
  • 删除共享内存对象
    System V IPC - key
4.4.1 System V IPC - ftok
#include <sys/types.h>
#include <sys/ipc.h>

key_t ftok(const char *path(文件的节点号), int proj_id);
  • 成功时返回合法的key值,失败时返回EOF
  • path:存在且可访问的文件的路径
  • proj_id:用于生成key的数字,范围1-255
4.4.2 共享内存创建 - shmget
#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key t key, int size, int shmflg);
  • 成功时返回共享内存的id,失败时返回EOF
  • key:和共享内存关联的key,IPC_PRIVATE或ftok生成
  • shmflg:共享内存标志位 IPC_CREAT|0666

注:

enshang@enshang:~$ ipcs 命令:查看消息队列 共享内存 信号灯集
4.4.3 共享内存映射 - shmat
#include <sys/ipc.h>
#include <sys/shm.h>

void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 成功时返回映射后的地址,失败时返回(void *)-1
  • shmid:要映射的共享内存id
  • shmaddr:映射后的地址, NULL表示由系统自动映射
  • shmflg标志位:0表示可读写;SHM RDONLY表示只读
4.4.4 共享内存撤销映射 - shmdt(仅撤销不删除,代表着这块内存不能使用,但若不删除容易造成内存泄漏)
#include <sys/ipc.h>
#include <sys/shm.h>

int shmdt(void *shmaddr):
  • 成功时返回0,失败时返回EOF
  • 不使用共享内存时应撤销映射
  • 进程结束时自动撤销
4.4.5 共享内存控制(删除) - shmctl
#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • 成功时返回0,失败时返回EOF
  • shmid:要操作的共享内存的id
  • cmd:要执行的操作 IPC_STAT IPC_SET IPC_RMID
  • buf:保存或设置共享内存属性的地址
4.4.6 共享内存 - 注意事项
  • 每块共享内存大小有限制
  • ipcs -l
  • cat /proc/sys/kernel/shmmax
  • 共享内存删除的时间点
  • shmctl(shmid, IPC RMID, NULL) 添加删除标记
  • nattach 变成0时真正删除
4.5 代码示例
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include<sys/shm.h>
#include<string.h>

int main()
{
	key_t key;
	int shmid;
	char *buf;
	
	key = ftok("keytest", 100);
	if (key < 0)
	{
		perror("ftok");
		return 0;
	}
	printf("key=%x\n", key);
	
	/* 创建id:写-取消注释,读-不取消注释
	shmid = shmget(key, 512, IPC CREAT|0666);
	if (shmid < 0)
	{
		perror("shmget");
		return 0;
	}
	printf("shmid=%d\n", shmid);
	*/
	
	buf = shmat(shmid, NULL, O);
	if (buf < 0)
	{
		perror("shmat");
		return 0;
	}
	
	//strcpy(buf, "hello world"); // 写 
	printf("share mem=%s n", buf); // 读

	shmdt(buf); // 撤销映射
	shmctl(shmid, IPC RMID, NULL); // 真正删除
}

总结

本章为嵌入式学习系列文章 第五章:进程、线程和进程间通信の第七节 共享内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值