本节学习内容
1.共享内存基本概念
2.共享内存的创建(共享内存使用必须伴随信号量使用)
3.消息队列基本概念
4.消息队列的创建
一、共享内存的基本概念
原理:共享内存是先在物理内存上申请一片空间,多个进程可以将其映射到自己的虚拟地址空间中,所有进程都可以访问共享内存(与共享内存建立连接(映射))
所需头文件:sys/shm.h
原理图:
共享内存相关接口函数
(1)shmget()用于创建或获取共享内存 (2)shmat()将共享内存空间映射到进程的虚拟地址
(3)shmdt()断开当前进程指向的共享内存 (4)shmctl()控制共享内存
二、代码创建共享内存
进程shm.c创建共享内存并向其输入数据代码如下
进程pshm.c打开所创建的共享内存并读取共享内存中的数据代码如下
控制同一时刻只能有一个进程访问共享内存的信量代码如下
sem.h文件
sem.c文件
运行结果如下:
结果总结:如上我们能看到,通过信号量控制共享内存,一个进程向共享内存中写数据(该进程写入时,其余进程不能与共享内存建立连接),写入后,另一个进程在共享内存中读数据(读取时,第一个进程与共享内存先断开连接,该进程与共享内存建立连接,读取后,与共享内存断开连接,重复此过程)
三、消息队列基本概念
消息队列头文件:sys/msg.h
(1)消息队列的创建在内存中
(2)定义消息队列结构体时第一个成员类型为长整型(long int),用来保存消息类型(类型值要>=1)
(3)计算消息大小时不用算类型所占字节
(4)消息队列读取时,0号消息代表可以读任意类型消息
消息队列相关接口函数:
msgget()用于创建或获取一个消息队列 msgsnd()发送一条消息
msgrcv()接收一条消息 msgctl()控制消息队列
(5)ipcs -q显示系统中存在的消息队列
四、代码实现消息队列
发送消息队列的进程
接收消息的进程
代码运行如下,我们开始没有消息队列,我们通过msg文件向系统发送3个消息队列
然后,通过pmsg接收消息队列
实现成功