进程通信的原理
是不同的进程能看到同一片内存空间
不同进程相应的描述用的结构体的虚拟地址首地址建立在内存共享区,通过页表挂接在相同物理内存。
共享内存是进程间通信的一种方式,它允许不同的进程看到同一片内存空间。共享内存的生命周期是随内核的,用户不主动关闭,共享内存一直存在,直到系统重启。关闭共享内存使用shmid,指令为ipcrm -m shmid。
同时释放共享内存是,去关联释放也就是硬链接为0,释放。
接口
shmget
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size,int shmflg);
怎么保证不同的进程看到同一个共享内存?
通过操作系统中唯一的key怎么知道共享内存是存在还是不存在?
通过shmflg,
IPC_CREAT(单独使用):如果申请的共享内存不存在,就创建,存在就获取并返回
IPC_EXCL(不单独使用)
IPC_CREAT | IPC_EXCL:如果申请的共享内存不存在,就创建,存在就报错。第一次创建时候使用接口的返回值返回的是shmid,共享内存标识符
key vs shmid
key是用户程序和内核通信的凭证,shmid是内核为共享内存分配的id
key是操作系统内标定的唯一性,也就是创建时使用,从此不再用到key
shmid只在进程内用来表示资源的唯一性
key的特点
- key只需要知道在内核中具有唯一性,能让不同进程进行唯一性标识
- 第一个进程使用key创建共享内存,之后的进程使用key获取共享内存
- key在存在于共享内存的描述对象中
- key的创建
#include<sys/types.h> #include<sys/ipc.h> key_t ftok(const char *pathname, int proj_id);- pathname:文件路径,可以是任意存在的文件
- proj_id:项目id,可以是任意值,只要和pathname组合起来是唯一的即可
- 返回值:key
补充指令
ipcs -m 查看共享内存
共享内存的特点
- 共享内存的生命周期是随内核的
用户不主动关闭,共享内存一直存在,直到系统重启
关闭共享内存使用shmidipcrm -m shmid