我的第一个服务器项目分了前后端,而其中前后端的数据通讯就是使用shm共享内存的方式,所以对于这块会比较有感觉。
1、共享内存是在多个进程之间共享内存区域的一种进程间的通信方式。
2、它是在多个进程间通过对指定内存段进行映射实现内存共享的。
3、这是IPC最快捷的方式,因为它没有中间商赚差价。
4、多个进程间共享的是同一块物理空间,仅仅是挂载地址不同而已,因此不需要进行复制,可以直接使用这段空间。
1、创建共享内存函数shmget()
/*shmget函数用于创建一个新的内存段,或者打开一个原有的内存段*/ #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key,size_t size,int shmflg);
参数释义:shmflg取值范围:IPC_CREAT、IPC_EXCL
2、共享内存挂载到进程下函数shmat()
//该函数用于将开辟好的共享内存挂载到本进程名下 #include <sys/types.h> #include <sys/shm.h> void *shmat(int shmid,const void *shmaddr,int shmflg);
参数释义:
shmid:上面那个函数的返回值。
shmaddr:一般放0,系统就会自己去找一块为映射的地址。
3、断开共享内存连接函数shmdt()
//从进程中删除共享内存与从内核中删除共享内存是两个概念 #include <sys/types.h> #include <sys/shm.h> int shmdt(const void *shmaddr);
4、共享内存控制函数shmctl()
#include <sys/types.h> #include <sys/shm.h> int shmctl(int shmid,int cmd,struct shmid_ds *buf);
参数释义:
cmd:IPC_STAT:获取内存段的shmid_ds结构,用buf传出。
IPC_SET:设置内存段中的shmid_ds结构下的ipc_perm成员的值,从buf里面获得。
IPC_RMID:标记某个内存段,已备删除。(只有当连接该内存段的最后一个进程与他断开连接之后才会执行删除)
struct shmid_ds { struct ipc_perm msg_perm; //后面写 size_t shm_segsz; //段大小,以字节为单位 time_t shm_atime; //最后挂载时间 time_t shm_dtime; //最后卸载时间 time_t shm_ctime; //最后修改时间 pid_t shm_cpid; //建立者 pid_t shm_lpid; //最后一个at/dt操作的进程PID shmatt_t shm_nattch; //现挂载数量 ··· } //下面这个是关键 struct ipc_perm { key_t key; //键值 uid_t uid; gid_t gid; //用户GID uid_t cuid; gid_t cgid; //建立者GID unsigned short mode;//权限 unsigned short seq; //序列号 }
我的服务器shm模块
提取码:r3ne