前言
进程间通信的目的
操作系统为用户提供的用于实现进程之间进行通信的方式。
Notes:进程之间是无法直接通信的,因为每一个进程都有自己独立的虚拟地址空间,所以进程具有独立性,无法直接通信。
进程间通信方式有几类:匿名管道、命名管道、共享内存、消息队列、域socket、信号量。
一、匿名管道
二、命名管道
三、共享内存
本质:一块物理内存
原理:开辟一块物理内存空间,多个进程将同一块内存通过页表映射到自己的虚拟地址空间,通过自己的虚拟地址空间直接进行访问。
操作流程:
1.创建或打开共享内存
2.将共享内存映射到进程的虚拟地址空间
3.通过映射的虚拟地址进行各种内存操作
4.解除映射关系
5.删除共享内存
共享内存的生命周期随内核,不与进程同进退。
操作接口:
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
Key:标识符,多个进程通过相同的标识符打开同一块共享内存
Size:创建时候所开辟空间大小,如果已经内存存在,则被忽略。(以内存页为单位,默认是:4096个字节)
Shmflg:打开方式+创建权限(IPC_CREAT | IPC_EXCL | 0664)
返回值:成功:返回非负整数–>操作句柄;失败返回-1。
void *shmat(int shmid, const void shmaddr, int shmflg);
Shmid:shmget返回的操作句柄
Shmaddr:映射地址–通常为NULL;
Shmflg:映射成功后的访问方式:SHM_RDONLY-只读;0-读写
返回值:成功返回映射后的首地址,失败返回(void)-1;
int shmdt(const void *shmaddr);
解除映射关系。Shmaddr:映射后的首地址。
返回值:成功0,失败-1;
int shmctl(int shmid, int cmd, struct shmid_ds *buf);删除共享内存
Shmid:shmget返回的操作句柄,cmd:操作类型–IPC_RMID–标记共享内存为被销毁状态。Buf:同于设置或获取共享内存信息,不使用则置null,返回值对于IPC_RMID则是成功0,失败-1;