1、定义和理解
共享内存就是允许两个不相关的进程访问同一个逻辑内存。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
- 原理部分参考:[进击的小学生]:https://blog.csdn.net/q1007729991
2、使用流程
1)创建共享内存 shmget
函数原型
int shmget(key_t key, size_t size, int flags);
-
参数 key:用户给定的键值。
-
参数 size:共享内存的大小。
-
参数 flags:可选项 。
-
返回值:shm_id。
2)将共享内存挂载到线性地址上 shmat -- at:attach
函数原型
void *shmat(int shm_id, const void *shm_addr, int shmflg);
-
shm_id:shm_id是由shmget()函数返回的共享内存标识。
-
shm_addr:shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
-
shmflg:shm_flg是一组标志位,通常为0。
-
返回值:调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.
3)从进程中卸载该共享内存 shmdt -- dt:detach
int shmdt(const void *shm_addr);
- shm_addr: shm_addr是shmat()函数返回的地址指针,调用成功时返回0,失败时返回-1.
4)控制共享内存 shmctl()函数 -- ctl:control
int shmctl(int shm_id, int command, struct shmid_ds *buf);
函数参考:https://www.cnblogs.com/52php/p/5861372.html
3、简单示例 无错误处理
查看ipc命令 ipcs
# a.c
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<string.h>
int main(){
int id = shmget(0x8888,4096,IPC_CREAT|IPC_EXCL|0664);
printf("%d\n",id);
char * buf = shmat(id,NULL,0);
strcpy(buf,"12345\n");
shmdt(buf);
return 0;
}
#b.c
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<string.h>
int main(){
int id = shmget(0x8888,0,0);
printf("%d\n",id);
char *buf = shmat(id,NULL,0);
printf("%s\n",buf);
shmdt(buf);
return 0;
}
网友评论