简介:
共享内存两个或多个进程共享物理内存的同一块区域(通常被称为段),由于一个共享内存段会称为一个进程用户空间的一部分,因此这种IPC机制无需内核介入。需要做的就是让一个进程将数据复制到共享内存段中,这部分数据会对其他所有共享同一个段的进程使用。这种技术比管道的速度更快。
使用步骤:
- 调用shmget()创建一个新共享内存段或取得一个既有共享内存段的标识符。
- 使用shmat() 来附上共享内存段,即使该段称为调用进程的虚拟内存的一部分,与当前进程关联起来。
- 使用shmat()调用返回的addr值,他是一个指向进程的虚拟地址空间中该共享内存段的起点的指针
- 调用shmdt() 来分离共享内存段,之后无法引用这块共享内存了
- 调用shmctl()来删除共享内存段。只有所有附加内存段的进程都与之分离之后内存段才会销毁。只有一个进程才需要执行这一步。防止其他进程使用这个共享内存·。
操作函数:
int shmget(key_t key,size_t size,int shmflg);
-功能:创建一个新的共享内存段,或者获取一个既有的共享内存段的标识
新创建的内存段中的数据都会被初始化为0
-参数:
-key:key_t是一个整形,通过找到或者创建一个共享内存.一般使用16进制表示 ,非0值
-size:共享内存大小
-shmflg :属性
- 访问权限
- 附加属性:创建/判断共享内存是不是存在:IPC_EXCL,
返回值:-1 并设置错误号
成功: >0 返回共享内存的引用ID,后面操作都是引用这个ID
共享内存实现进程间通信:
write
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
int main()
{
//1.创建一个共享内存
int shmid = shmget(100,4096,IPC_CREAT | 0664);
printf("shmid : %d\n",shmid);
//2.和当前进程进行关联
void * ptr = shmat(shmid,NULL,0);
char * str = "helloworld";
//写数据
memcpy(ptr,str,strlen(str)+1);
printf("按任意键继续");
getchar();
//解除关联
shmdt(ptr);
//删除共享内存
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
read
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
int main()
{
//1.获取一个共享内存
int shmid = shmget(100,4096,IPC_CREAT);
printf("shmid : %d\n",shmid);
//2.和当前进程进行关;
void * ptr = shmat(shmid,NULL,0);
char * str = "helloworld";
//读数据
printf("%s\n",(char *)ptr);
printf("按任意键继续");
getchar();
//解除关联
shmdt(ptr);
//删除共享内存
shmctl(shmid,IPC_RMID,NULL);
return 0;
}